perm filename ITS.JP[UP,DOC] blob sn#233948 filedate 1976-08-30 generic text, type T, neo UTF8
 	This is file .info.;ddt order at MIT-AI ITS

A concise summary of DDT and monitor commands for ITS systems
Documentation for DDT version 626 - Table of contents:
 (Each heading is the second line of its own page.
  The first line of each page is blank.
  There are no actual altmodes in this file;  dollar signs are
  used instead.  There are no non-formatting control characters;
  uparrow and a non-control character are used instead)

List of DDT commands

Colon commands

Built-in colon commands

Reading of filenames

Defaulting of filenames

DDT's unames

Specially used symbols

Typeout modes

Bit typeout mode

Unsolicited typeouts

Unsolicited offers

Returning to DDT

Instructions that call DDT

Symbol table format
List of DDT commands.

Note that angle brackets are used to delimit meta-variables.

Each of the following commands that takes a prefix arg
does so in one of two ways:
 If the arg is called <name>, <dev>, <user>, <prgm>, <flags>, <fn1>,
   it is the syllable immediately preceding the operator.
 If it is a symbol, the symbol's name is used;
   otherwise it is considered to be SIXBIT for the desired name.
   eg. FOO$J and $1'FOO$$J  are equivalent.
 All other commands evaluate all the preceding syls and ops
   to get 1 to 3 arguments (separate them with $,).

↑@	will terminate an execute file or valret string.

↑B	is a special interrupt-level character, which turns
	on output to the wallpaper file if there is one,
	by zeroing ..LPTFLG.
	In files and valret strings, one ↑B merely counteracts
	one ↑E, by SOSing ..LPTFLG unless it is 0.
	When a wallpaper file is open and output to it is on,
	every character DDT outputs goes to it,
	as does every character that DDT reads and echoes.
	↑B, ↑E, ↑V and ↑W are interpreted at interrupt
	level when typed on the TTY;  when present in
	execute files and valret strings, they are
	interpreted when read.  They will not be seen at
	any higher level (eg. ASCII type-in);
	in files and valrets, they will be ignored
	within :IF conditionals that fail.

↑C	types a CR-LF but doesn't close the open location,
	terminate an expression, reset the temporary mode, etc.
	The CRLF will be typed even if ↑W has turned off TTY output.
	↑C terminates execute files.

$$↑C	half-kills the last symbol typed out (not counting index
	fields of instructions), then retypes $Q in the current mode
	(after DDT types JRST FOO(A) ,  $$↑C will half-kill FOO).

↑D	is a special character which types "XXX?" and flushes
	any incompletely typed in command.
	If typed while a $E, $N or $W search is in progress,
	the search is stopped.

↑E	is a special interrupt-level character which turns off
	output to the wallpaper file (if any) but does not close it.
	See ↑B.

↑F	lists the last directory referenced.
<dev>↑F	lists directory of device <dev>, using the :PRINT default
	sname, and sets default :PRINT device
	(by special dispensation, that isn't done if <dev> is TTY !).
	Doesn't work if <dev> is also the name of a directory on DSK:.
	In that case, you get ...
<user>↑F
	lists user <user>'s directory,
	setting defaults as <dev>↑F does.
	If <user> isn't a directory, and isn't a device name either,
	the default sname for :PRINT, ↑F, etc. is still set.
	Thus, <user>↑f <dev>↑f will show the directory of
	<dev>:<user>; even if <user> isn't a disk directory.
0↑F	is the same as <msname>↑F.
$↑F:
<dev>$↑F
	is like <dev>↑F but doesn't set :PRINT defaults;
	just the default for ↑F without argument.
<user>$↑F
	is like <dev>$↑F crossed with <user>↑f.

$$↑F	prints an abbreviated version of the current default
	directory, using DIR:FIRST <default fn1>.
	If default device wasn't disk, this doesn't do what
	you would want.
	The DIR: device listing mode used by $$↑F is controlled
	by the variables ..DIRF and ..DIRF+1 in DDT.
	..DIRF is the FN1 passed to DIR: (initially "FIRST").
	..DIRF+1 is the FN2 (initially 0, meaning use the default
	FN1 for :PRINT).
<fn1>$$↑F
	sets the default FN1 (for :PRINT, :DELETE, etc) to
	<fn1>, then does $$↑f to print DIR:FIRST <fn1>.

↑G	is a special interrupt level character that aborts
	anything.  Shouldn't be used to quit out of
	commands that create or destroy symbols, jobs,
	input sources, or jobs' command buffers,
	or that change jobs, unless DDT is hung.

↑H	equivalent to $J $P

<prgm>↑H
	continues <prgm>, creating one if necessary.
	If a job named <prgm> exists, it will be $P'd
	(or $G'd if it was loaded but never started).
	Otherwise, <prgm>↑K is done:  a job <prgm> is
	created, and <prgm> is loaded in and started.
	Since ↑H only loads <prgm> if no job <prgm>
	already exists, ↑H never clobbers anything useful.
	If the existing job is disowned, it will be reowned
	before being proceeded, of course.
<prgm>$↑H
	like <prgm>↑H but loads symbols if a new job is made.

↑I (tab)
	goes to the next line, and then "types and opens
	the RH of $Q", which involves typing the RH
	of $Q as an address, typing a slash, and then
	printing the contents of the address typed
	(in the current type-out mode), just as if the
	"/" command had been used.

<arg>↑I deposits <arg> in the open location if any,
	then types out and opens the RH of <arg>.
$↑I, <arg>$↑I
	are like ↑I, <arg>↑I but use the LH rather than the RH.
$$↑I, <arg>$$↑I
	are like ↑I, <arg>↑I but do an effective address
	calculation on $Q or <arg> to determine the address
	to type and open.

↑J (linefeed)
	Types out and opens location .+1
	(remember that "." is always the last location opened).
	Unlike ".+1/", ↑J does NOT push the old value of "."
	onto the 'ring buffer of "."'.

<arg>↑J
	stores <arg> in the open location, if any, then does ↑J.

$↑J	pops the ring buffer of point, then does ↑J.
	After " 100/ 200/ ", $↑J would open 101 .
	See $↑M.

<arg>$↑J
	stores <arg> in the open location, if any,
	then does $↑J.

$<n>↑J	pops the ring buffer of "." <n> times,
	then does ↑J.

<arg>$<n>↑J
	stores <arg> in the open location, if any, then
	does $<n>↑J.

<prgm>↑K
	creates a job named <prgm>, loads
	TS <prgm> into it without symbols,
	(looking for the file on your directory, the SYS directory,
	the SYS1 and SYS2 directories, and the dirs. in the sname
	search list) and starts it, giving it the TTY.
	The program is given a null :JCL command string.
	If a job named <prgm> already existed,
	the newly loaded copy of <prgm> overwrites it.
	Since that can be a screw,
	if the job was disowned, or if ..CLOBRF is nonzero,
	DDT will ask the user "--Clobber Existing Job--".
	After such a query, type a space to tell DDT to go ahead
	and clobber the job;  type anything else to abort.
	DDT will query "--Reload Protected Job--"
	if the job is "protected"
	(its ..SAFE variable has been set nonzero).
<prgm>$↑K
	is like <prgm>↑K but loads the symbols.
$↑K	loads the current job's symbols from the
	file which was loaded (eg by ↑K)

$$↑K	disowns the current job.
	An infix argument is used as the control-bits for the
	DISOWN system call:
$$10↑K	disowns the job and arranges that if it ever remains stopped
	or blocked for an hour without being reowned or attached,
	the system will kill it.  "10" may be combined with the other bits.
$$4↑K	disowns the current job and starts it, simultaneously
	(as far as it can tell).  "4" may be combined with "1" and "2":
$$1↑K	makes the current job into a non-disowned, top level
	job (but not console-controlled).  Useful for resurrecting
	dead system demons.  It is antisocial to use the "1" and "2"
	bits for private purposes.
$$2↑K	makes the current job be a disowned job scheduled as
	part of the system (ie sharing the system job's resource
	word).
$$3↑K	makes the current job be a non-disowned top level job
	with the system job's resource word.

↑L	is a special character that retypes buffered characters
	and syllables.  It first types a CRLF or clears the screen.
	It is ignored entirely in execute files & valret strings.

↑M (carriage-return)
	closes the open location if any, without changing it.
	Resets the temporary (or "current") typeout mode
	to the permanent mode.
<arg>↑M
	deposits <arg> in the open location if any,
	and closes it.  Resets the current mode.
$↑M	pops the ring buffer of ".", then
	types and opens the new ".", tab-style, on a new line.
	Does not reset the current mode to the permanent mode.
	After "100/ 200/", $↑M would pop the ring buffer once,
	leaving 100 on the top, so 100 would be opened.
<arg>$↑M
	stores <arg> in the open location if any, then does $↑M.
$<n>↑M	like "$↑M", but pops the ring buffer of "." <n> times
	instead of once.
<arg>$<n>↑M
	stores <arg> in the open location, then does $<n>↑M.

$$↑M	does nothing if no location is open.
	Otherwise unpurifies the page the open location is in
	(by replacing it with a copy).
	$$↑M is superfluous unless ..UNPURF has been zeroed.
<arg>$$↑M
	like $$↑M but deposits <arg> in the location
	after unpurifying.

↑N	proceeds one instruction, then returns to DDT.
<n>↑N	proceeds <n> instructions, then returns to DDT.
	In "care" mode, uuos will be treated specially - the whole
	UUO handler will be executed.  See $↑↑ command, Y flag.

$↑N	puts temporary breakpoints in the 2 words
	after the next instruction to be executed, then $P's.
	These breakpoints will go away if either one of them is hit.
	This command is useful for stepping over an entire subroutine
	call at full speed and stopping after it.
	If the instruction to be executed next is
	a PUSHJ, the AC used and its contents are remembered and
	the breakpoints will be conditional on the AC's having
	the same contents.  Thus, if the PUSHJ is a recursive
	call all the inner recursions will execute and return
	without stopping on the breakpoint.
	Actually, the breakpoints don't always go immediately after
	the instruction to be executed next;  they start on the
	first "reasonable" instruction after it ("reasonable"
	here means "nonzero op-code field").  This makes it possible
	sometimes to step over calls taking following arguments
	without taking any special care.
$<n>↑N
	similar but puts the breakpoints <n> words after the insn:
	at $.+<n>+1 and $.+<n>+2 .  Good for calls followed by <n> args.
	This form of $↑N overrides DDT's search for the next "reasonable"
	instruction by telling it explicitly how many args there are.
<pc>$↑N
	like $↑N but puts the breakpoints at <pc> and <pc>+1
	and does no special hacking for PUSHJ instructions.
	Also, DDT will not be insubordinate by looking for
	reasonable instructions, since it has been told explicitly
	what to do.
<p>,$↑N
	puts the breakpoints at the address in the
	word pointed to by the RH of accumulator <p>.
	If you accidentally ↑N through a PUSHJ, <p>,$↑N
	will proceed until after the subroutine POPJ's.
	This is not considered to be an explicit specification
	of where to break, so DDT looks for a reasonable
	instruction.
<p>,$<n>↑N
	is similar, but puts the breakpoints <n> words later,
	overriding DDT's search for a reasonable instruction.
	good for subroutines with <n> args after the call.
-<n>(<p>)$↑N
	uses  @-<n> ( <p> ) as the location of the first
	of the 2 breakpoints.

$$↑N	executes one instruction at a time until the PC
	gets to be 1 or 2 larger than it was when the
	command was given.
	This command can be used to step through an entire
	subroutine call.  However, $↑N is so much more efficient
	that it should be used instead if possible.
<pc>$$↑N
	is like $$↑N but continues till the PC is
	equal to <pc> or <pc>+1.

↑O <file>
	deletes the specified file.  It
	warns you what it will do, with "(Delete File)"
	(but see ..DELWARN)
$$↑O <file1>,<file2>
	renames <file1> as <file2>.

↑P	proceeds the job without giving it the TTY.
	If it's running, does nothing.
	If it's waiting, lets it return and doesn't start it.
	Normally, clears the job's %TBWAT bit, so if it
	tries to use the TTY, it will interrupt and say
	"Job <jname> wants the TTY".  However, this feature
	can be overridden - see ..TWAITF
$↑P	is like ↑P except that %TBWAT is set instead of cleared,
	so that if the job tries to use the TTY it will hang
	dumbly until it is $P'd.  You can interchange the meaning
	of ↑P and $↑P - see ..TWAITF

↑R <file>
	is equivalent to ":PRINT <file>" - the spec'd file
	is typed on the terminal.

↑S	is the "shut up" character.  It turns off typeout
	at interrupt level, but turns it on again when read.
	Thus it turns off typeout for the remainder
	of the command currently being processed, not permanently.

<user>↑S
	sets the current job's sname to <user>
<user>$↑S
	causes the next ↑K, ↑H or :-command, if it runs a program,
	to run it "as if <user> were running it".  Precisely, its
	.XUNAME variable will be <user> instead of you.  If the
	program follows the current convention, it will use <user>'s
	init file, etc.  $↑S works by setting the ..TUNAME variable.
$↑S	like <xuname>$↑S;  it undoes the effect of <user>$↑S.
<user>$$↑S
	sets the master system name (the "msname"),
	the ↑O-default sname, the current job's
	$L-default sname, and the sname for ↑F, to <user>.
	The master system name is used:
	 To initialize the snames of newly created jobs.
	 To initialize their $L-default snames.
	 To say which directory to search before SYS:
	  for the ↑K command.

↑T	makes filename-translations:
<flags>↑T <file1>,<file2>
	creates a translation entry for the current job,
	translating <file1> to <file2>.  The effect will
	be that if the job tries to open <file1>, it
	will actually get <file2>.  Any of the names
	in the two files may be *, meaning
	"translate any name" in <file1>,
	"don't change name" in <file2>.
	<flags> should contain any subset of "A", "I", "O".
	"A" means don't retranslate the result of applying this
	 translation.
	"I" means translate on input, "O" output.
	"IO" is the default if <flags> is null.
<flags>$↑T <file1>,<file2>
	creates a translation that applies to DDT
	and all of its inferiors to all levels.
<flags>$$↑T <file1>,<file2>
	creates a translation for the current job and
	all of its inferiors to all levels.

↑U	removes filename translations:
<flags>↑U <file>
	deletes any translation the current job may have
	which says the <file> should be translated.
	I↑U will only remove a translation for input,
	and won't affect translations for output.
	It will change a bidirectional translation into
	an output-only translation.
	If you are not sure what translations you made,
	do :PEEK T<cr> to see them all.
<flags>$↑U <file>
	removes a translation such as $↑T would create.
<flags>$$↑U <file>
	removes a translation such as $$↑T created.

↑V	is a special interrupt-level (see ↑B) character that
	turns on output to the TTY by zeroing ..TTYFLG .
	In valrets and files, merely SOSes it (unless already 0)
	thus, one ↑V in a valret or file cancels one ↑W.

↑W	special interrupt-level character that turns off
	typeout on the TTY by AOSinG ..TTYFLG  .  see ↑B.

↑X	stops the current job, leaving it in a state like
	that after a ↑Z.
	A job waiting to return is allowed to do so, but if
	it is trying to commit suicide it will be stopped
	instead.  ↑X does nothing to a stopped job.

$↑X.	(the point is required)
	deletes the current job.  It types the name of the
	new current job, followed by "$J", unless there are
	no longer any jobs.  If the job to be killed
	is "protected" (its ..SAFE variable has been set nonzero),
	DDT will ask for confirmation before killing it.

$<n>↑X.
	is like $↑X., except that after killing the current
	job, $<n>J rather than $J is used to select another.

$$↑X.	(the point is required)
	kills all jobs.  If there are any protected jobs, DDT asks for
	confirmation.

↑Y	uses $Q as an AOBJN pointer to a symbol
	table in the current job's core, which should be
	appended to DDT's symbol table.
	Make sure that every symbol has either the local
	bit or the global bit (4.8 or 4.7) set;  otherwise,
	a "DDT bug" message may result.  DDT does not check
	for this because it would cause great inefficiency.
<arg>↑Y	is similar but uses <arg> instead of $Q.
$↑Y	is like ↑Y but flushes the symbols DDT already has.
<arg>$↑Y similar.

<addr>$$↑Y
	puts the symbol table into the job's core.
	It assumes that <addr> is the location of an AOBJN pointer
	to an old symbol table, which is to be replaced by DDT's
	current one.  The new symbol table is stored in core
	so that it ends at the same place as the old one;
	expansion or contraction occurs at the low end in core.
	The AOBJN pointer is updated to record the new size.
	These actions are such that DDT-2$$↑Y will give the symbols
	to a non-timesharing DDT in the job.

↑\	begins a patch at the location open (the location
	"being patched").
	It is a convenient way to replace one instruction
	(at the open location) by several (the patch).
	The instructions in the patch are stored in the
	job's "patch area", a spare area allocated specifically
	to such use.  Every program should allocate one.
	The beginning of the patch area is the value of
	PATCH if it is defined, or the value of PAT
	if it is defined, or 50 .
	As patches are made, PATCH will be redefined to
	point to the next free location in the patch area.
	PATCH should be in the GLOBAL block, so if you
	use MIDAS block structure, define it with PATCH":.
	A patch started with ↑\ must be terminated with some
	variety of ↑] command, which will store first the JUMPAs
	back from the patch to the patched routine (two of them,
	in case the patch skips), and then a JUMPA from the
	location being patched to the patch itself.
	This order of actions guarantees that the patch will
	never appear to be "half made" in any way that
	that might cause trouble in a running program.

	↑\ begins by typing and opening the first location of
	the patch area.  Then the contents of the location being
	patched are typed out and left as the argument to the
	next command.  If you wish to include that instruction
	as the first instruction of the patch, type ↑J.
	If you wish to get rid of it, type <rubout>.
	Then deposit the other instructions of the patch,
	and finish with a ↑] (which see).

	While patching, the pseudo-location ..PATCH
	contains <location being patched>,,<start of patch>.

<arg>↑\
	deposits <arg> in the open location, and then starts
	a patch.  Fully equivalent to ↑\<rubout><arg>, except
	that with <arg>↑\, <arg> will be present in the program
	while the patch is being made.

$$↑\	unmakes the patch previously made to the open location.
	$$↑\ uses the JUMPA to the patch to find the instruction
	that the patch replaced.  This works only for patches
	made by ↑\, which were either closed by $↑], or
	closed by ↑] and having the old instruction as the
	first instruction of the patch.

↑]	ends a patch started by ↑\.  Two JUMPAs back to the
	locations following the one being patched
	are stored in the two words starting with the
	open location (or in location .+1 if no location is open).
	Then in the location being patched is stored a JUMPA
	to the beginning of the patch.
	Finally, PATCH is redefined to point at the word after
	the second JUMPA back (the first free location of the
	patch area).  If PATCH is already defined, it is
	redefined in the same block;  otherwise it is defined
	in the current block.  PATCH should be defined as global
	in order to force it to be in the outermost block.

<arg>↑]	stores <arg> in the open location, opens the next
	location, then does ↑].

$↑]	is like ↑] but first stores the contents of the place
	the patch was made from in the open location
	and linefeeds.  It is useful for putting a patch "before"
	an existing instruction.

<arg>$↑]
	stores <arg> in the open location, opens the next
	location, then does $↑].

$$↑]	is like $↑] but omits the JUMPAs back to the place that
	the patch was made from.  It is useful when a patch is put
	on top of a JRST or POPJ - it will store an identical JRST
	or POPJ, and nothing else.  $$↑\ (unpatch) can't work
	after $$↑] because necessary information isn't there;  it
	can however figure out that it can't win and will complain.
	if this is important, use $↑] instead of $$↑].
<arg>$$↑]
	stores <arg> in the open location, if any, then moves down
	one word and does $$↑].

↑↑	begins multi-stepping according to the job's stepping flags,
	and continues indefinitely.  Multi-stepping involves
	printing the next instruction and executing it, repeatedly.
	Each step is done with a ↑N or an $↑N depending
	on the type of instruction and the settings of the
	stepping flags.  Other flags cause stepping to stop before
	certain kinds of instructions.
	Errors, breakpoints, and .VALUE 0's will stop stepping.
	So will typing any character while DDT is typing the next
	instruction to step over.
	..DOZTIM holds the number of seconds that ↑↑ will insist
	must elapse between steps, to give the user a chance to
	decide whether to type a character and stop things.
	While multi-stepping, the SETAI instruction (a no-op)
	is part of a special kludge for making specific
	subroutines appear to be single
special.  When one is encountered on return from executing
	some other insn, it is considered to address a word
	containing the return address of a subroutine which has just
	been called.  (use "SETAI (P)" if you call with PUSHJ P,)
	DDT immediately does a $↑N to that address.
	The SETAI instruction is never printed out.
	Thus, the subroutine is treated as a single instruction
	even if not all subroutines are being so treated.
	Note that SETAI is not special with ↑N - only with ↑↑.

<n>↑↑	like ↑↑ but will stop after the <n>'th step
	if nothing stops it earlier.

$↑↑:
<flags>$↑↑
	like ↑↑ but first changes the job's stepping flags
	according to the letters in <flags>.
	(Don't put more than 6 letters in <flags>)
	The letters that mean something are:

	B	step over a subroutine
		 call in one step with $↑N
	C	stop before a subroutine call
		 (subroutine calls are PUSHJ, JSP, JSR, JSA)
	D	step over subroutine calls with ↑N and
		 then step through the subroutine.
	J	stop before jump insns.
	K	↑N over jumps.
	M	stop before monitor calls.
	N	↑N over monitor calls
		 (but $↑N over a .VALUE)
	P	print each insn before stepping over it (normal state)
	Q	print insn only when stepping stops before it.
	R	stop before subroutine returns (POPJ and JRA)
	S	↑N over subroutine returns.
	U	treat user UUOs as subroutine calls
	V	$↑N over user UUOs.
	W	stop before user UUOs.
	X	↑N thru user UUOs (and step thru UUO handler)
	Y	enter "care" mode in which ↑N'ing thru a UUO
		whether or not as a result of a ↑↑, will cause
		the saved PC in the UUO handler to have its
		1-proceed flag set, and the whole UUO handler
		to be executed as if it were one instruction,
		and return whenever the UUO handler restores
		the flags (with JRST 2,).
	Z	leaves "care" mode.

	Each job has its flags, which are updated by $↑↑
	and used by ↑↑.  The flags are initialized when the
	job is created, from the new-job-default flags,
	which are initially 'BPUZ' but may be changed
	with $$↑↑ (which might well go in an INIT file).

<n> <flags>$↑↑
	combines <flags>$↑↑ and <n>↑↑

<flags>$$↑↑
	sets the new-job-default stepping flags
	according to the letters in <flags>.
<flags>$$0↑↑
	sets the current job's stepping flags according to
	the new-job-default and the letters in <flags>.

$    (altmode-space)
	separates prefix command arguments, like altmode-comma.

!	divides.  Priority 2.

$!	floating divides.  Priority 2.
	If unary, reciprocates.

$$! or <arg>$$!
	opens a location as / or <arg>/ would, but doesn't type
	the contents.  $Q is set, however.  Future ↑J, ↑, and
	↑I commands will also not type the contents of the
	locations they open, until a /, [ or ] command is used.

"	retypes $Q in the " typeout mode, initially ASCII mode.
<arg>"	retypes <arg> in " typeout mode.

$"	selects the " typeout mode temporarily.  The " mode is
	controlled by the per-job variable ..TDQUOT.  Unless
	explicitly changed, it is full-word ASCII typeout:
	ASCII/<foo>/ is printed as $0"<foo>$ .
	ASCII/<foo>/+1 appears as $1"<foo>$ (the digit
	is the word's low bit).  ↑Q and ↑ are typed out
	with an extra ↑Q in front.  Other control characters
	are typed out as an uparrow followed by the
	un-controlified character.  Rubout is typed out as "↑?".
	See the section on typeout modes.

$$"	specifies " typeout mode as the current mode
	permanently, so that ↑M will not undo it.

$<n>"<foo>$
	is an ASCII syllable whose value is ASCII/<foo>/+1&<n>
	(that is, <n> specifies the word's low bit).
	To put a control character in <foo>,
	use uparrow (eg. uparrow and A for control-A).
	To put in an uparrow or altmode, precede it by ↑Q.
	A rubout typed in immediately after a ↑Q will be quoted,
	but a ↑Q will be rubbed out if other characters were typed
	in and rubbed out in between.  Rubout may be typed in as
	uparrow-questionmark.

$$<n>"	is used for multi-word ASCII type-in.  It acts just like
	$<n>" if 5 or fewer characters are typed.  When the
	sixth character is typed, the first five are deposited
	in the open location and the location after it is
	opened.  This is repeated for as many words as it
	takes to store the whole string of characters.

#	if there is anything before the #, it means exclusive-or;
	otherwise, it retypes $Q in # mode.

$# 	temporarily selects the # typeout mode,  This mode is
	controlled by the per-job variable ..TNMSGN.  Unless it
	has been explicitly changed, it is single-character
	ASCII typeout mode.  A value types out as $1# followed
	by the ASCII character in the low 7 bits.
	Thus MIDAS's "A is typed as $1#A  .
	MIDAS's ↑A (uparrow-a) is typed out as $1#↑A  .
	Rubout comes out as uparrow-questionmark.
	If the number to be typed out goes over the bottom 7 bits,
	the bottom 7 bits are typed as a character and the rest
	as an instruction;  MOVEI B,101 comes out as
	"MOVEI B, $1#A".

$$#	specifies # typeout mode as the current mode
	permanently, so that ↑M will not undo it.

$1#	used for single character type-in.
	Follow it by the character (uparrow and ↑Q quote
	as with $1").  The result is a syllable whose
	value is the ASCII for that character.
	Thus, "$1#A" means 101 .

$$	(altmode dollarsign)
	temporarily selects $ typeout mode.  That mode, held in ..TDOLLA,
	is initially symbolic mode (same as $S).  This command
	is useful only if the $ mode is changed to
	a user defined typeout mode.

$$$	(altmode altmode dollarsign)
	specifies $ typeout mode as the current mode
	permanently, so that ↑M will not undo it.


$%	temporarily selects the % typeout mode.  That mode is kept in
	the current job's ..TPERCE variable and is initially
	symbolic mode (same as $S).  This command
	is useful only if the % mode is changed to
	a user defined typeout mode.

$$%	specifies % typeout mode as the current mode
	permanently, so that ↑M will not undo it.

&	if not first thing typed, does logical-and, Priority 3.
	If not preceded by args, retypes $Q in & mode.

$&	temporarily selects & typeout mode.
	This mode, held in the current job's ..TAMPER,
	is initialized to SQUOZE mode in each new job.
	In SQUOZE mode, SQUOZE <n>,<sym> types out as $<n>&<sym>

$$&	specifies & typeout mode as the current mode
	permanently, so that ↑M will not undo it.

$<n>&<sym>
	a syllable whose value is the SQUOZE for <sym>,
	with <n> in the flags.  <n> should be from 0 to 74;
	the two lowest bits of <n> are ignored.

'	retypes $Q in ' mode (normally SIXBIT mode).
<arg>'	retypes <arg> in ' mode.

$'	temporarily selects ' typeout mode.
	This mode, held in ..TPRIME, is initially SIXBIT mode,
	in which SIXBIT/<foo>/ types out as   $1'<foo>$ .

$$'	specifies ' typeout mode as the current mode
	permanently, so that ↑M will not undo it.

$1'<foo>$
	is a SIXBIT syllable whose value is SIXBIT/<foo>/ .
	Only the first 6 characters of <foo> are significant.

$$1'	used for multi-word SIXBIT type-in.
	A cross between $1' and $$1".
	Uparrow is not special.

( and )
	are used for putting a value in an instruction's
	index field, or, more generally, for swapping the
	halves of a word-long value.
	The syllables between them are treated as a word.
	If the ( is preceded by an arithmetic operator,
	the parentheses and all between them act like
	one syllable whose value is the value of that word
	with its right and left halves interchanged.
	Otherwise, the two halves of that word are added
	into the opposite halves of the word within which
	the parentheses occur, in an otherwise invisible
	manner.  That is, the argument evaluator's state is the
	same after the ) as it was before the (.

$( and $)
	these are ignored completely (they can't even be rubbed out).
	useful with conditionals (see :if)

*	multiplies.  Priority 2.

$*	floating multiplies.  Priority 2.

+	adds.  Priority 1.

$+	floating adds.  Priority 1.

, (comma)
	is used to separate fields in a word.
	space also does so.  The significance of the fields
	in a word depend on the pattern of spaces and commas.
	Usually the value of the word is that of the first
	field, with all the other fields added into the RH.
	However, if the first field is followed by two commas, it is put in
	the left half, and otherwise if followed by one comma,
	it is put in the AC field.  If a space separates
	the first two fields and a comma ends the second
	the second is added into the AC field rather than the RH.
	examples:

<lh>,,	truncates <lh> to 18.  bits and puts it in the left half.

<lh>,,<rh>
	halfword type-in format.  <lh> is put in the left half, and
	<rh> in the right half.  Each is truncated to 18. bits first.

<insn> <ac>,
	a format which adds <ac> into the AC field of <insn>.

<insn> <ac>,<addr>
	a format like <insn> <ac>, but adds <addr> to the right half.

<ac>,	a format which results in <ac> in the AC field.

<ac>,<addr>
	puts <ac> in the AC field and <addr> in the address field.

$,	separates multiple args to one operator.

-	subtracts.  Priority 1.
	If unary, negates.

$-	floating subtracts.  Priority 1.
	Or, floating negates.

.	is a symbol whose value is usually the last location
	opened (except that \, etc., open but don't set .)
	Whenever "." is randomly changed, the old value is saved
	in a ring buffer with 8 slots.
	$↑M, $↑J and $↑ reopen the previous value of .,
	(plus or minus one for $↑J or $↑)
	↑J and ↑ increment and decrement the current
	value of ., rather than pushing the old value.

$.	has as its value the current job's user mode PC.

/	opens the location addressed by the RH of $Q.
	This means that vaious commands including ↑M
	will store into that location.  More immediately,
	it means that the location's contents will be
	typed out in the current mode and will be the new
	value of $Q.  Also, the location itself will be
	"pushed onto the ring buffer of . " meaning
	that .'s value is now that location, but $↑M, etc.
	can reopen the previous value of ".".
	(This will not be done if the location just opened
	is the same as the previous value of .)

<arg>/	opens the location addressed by the RH of <arg>.

$/ or <arg>$/
	opens the location addressed by the LH of $Q or <arg>.

$$/ or <arg>$$/
	does a PDP10-style address calculation on $Q or <arg>
	to determine what location to open.

:	defines symbols:
<sym>:	defines <sym> to have the same value "." currently has.
	If the symbol is already defined in the current block or
	any containing block, it will be redefined in the same block.
	Otherwise it will be defined in the current block.

<arg> <sym>:
	defines <sym> to have the value <arg>.

$:	selects symbol table blocks:
<block>$:
	selects the symbols in block or program <block>.

<block>$$:
	like <block>$: but insists on finding a block
	directly inferior to the currently selected one.
	Useful for resolving the ambiguity, when several
	blocks or programs have the same name.

;	retypes $Q in the "semicolon mode", temporarily SOS'ing ..TTYFLG
	so it takes two ↑W's to suppress the printout.
	(Useful in files that shouldn't echo but want to type stuff)
	The semicolon mode is the most recently specified
	temporary or permanent typeout mode,
	even if it was only a temporary mode which was later
	reset to the permanent mode.
	eg., $S sets the temporary mode and the semicolon
	mode to symbolic.  A carriage return will reset the
	temporary mode to the permanent mode but the
	semicolon mode will remain symbolic.

<arg>;	is similar but retypes <arg>, not $Q.

$; and <arg>$;
	are like ; and <arg>; but also reset the
	temporary mode from the semicolon mode,
	and don't temporarily SOS ..TTYFLG.

$$; and <arg>$$;
	are similar but also set the permanent mode.

< and >	(angle brackets)
	are like algebra's parentheses.

>	can be used to terminate an expression
	read in by a colon command (as can a carriage return)

$< and >
	surround an expression to be used as an infix
	argument in an operator.
	For example, $<1+1>R is equivalent to $2R

$$< and >
	are similar, for operators with two altmodes.

=	retypes $Q as a number in the current radix.
<arg>=	retypes <arg> instead.
$<r>=	retypes $Q as a number in radix <r>.
<arg>$<r>=
	retypes <arg> instead.
$=	retypes $Q as a floating point number.
<arg>$=	retypes <arg> instead.

$$=	retypes up to three arguments in the modes they have.

$>	when changing part of an instruction, saves typing
	the unchanged parts:
<arg>$>
	takes those parts of <arg> that are nonzero,
	or which are known to have been explicitly specified;
	takes the other parts of a word from $Q,
	and returns the sum.  The parts of a word used are:
	 op code	     777000,,
	 ac-field		740,,
	 indirect bit		 20,,
	 index-field		 17,,
	 address	      right half.
	the $> may actually appear anywhere within the argument,
	because it does nothing but set a flag when the evaluation happens.
	If an undefined symbol is used (with "?") in either half
	of the argument, it overrides that halfword of $Q.
	The fields which $> can tell have been explicitly specified are
	the AC field, the indirect bit ("@@" specs it explicitly as 0),
	the left half (eg, "0,,$>"), and the right half (eg ",0$>").
	some fields may be explicitly zeroed magically:  "0$>" zeroes
	the address field;  "0 $>", the op-code field;  and "()$>",
	the index field.
	If $> can determine that the quantity is an I/O instruction
	(CONI, etc.) a different set of fields is used:
	 op-code	    700340,,
	 device code.	     77400,,
	the rest are the same.
	In this situation, "<arg>,$>" will use <arg> to specify the
	device code.

?	performs many functions, in different situations:
<sym>?
	used in expressions to refer to a symbol currently undefined
	which will be defined later.  Attempting to do any
	arithmetic but addition on such objects, or to put them in
	the AC field, will lose.
	However, putting one before a ",," will succeed in putting
	it in the left half.
	Only two such objects may appear in an expression
	and they may be used only to deposit in a location.

	When an undefined-reference is deposited in core,
	what really happens is that an entry is made in the
	"undefined symbol table".  When a symbol is defined
	(with "<symbol>:"), the undefined symbol table is
	searched, and the value is placed in the locations
	that need it.  The table entries for those locations
	are then removed.
	The undefined symbol table is dumped by $Y, loaded
	by $L, and merged by $$L.  It can be listed by
	:LISTU.

?	right after a "?U?" (undefined symbol) error message
	creates a reference to that undefined symbol, just as
	if the "?" had been typed right after the symbol
	with no other intervening operator.  For example,
	if FOO is an undefined symbol, and "FOO+BAR" is typed,
	a "?U?" error will occur after the "+".
	At that point, "?+BAR" will recover, producing an
	ultimate result equivalent to "FOO?+BAR".

?	retypes $Q in $H$? mode (bit typeout mode).
	(if there is no current job, types the :HELP text instead)

<arg>?	where <arg> does not end with a symbol
	(use a space before the "?" to play it safe),
	retypes <arg> in $H$? mode.

$?	temporarily reselects bit typeout mode, with the details
	as they were last specified.
<prefix>$?
	temporarily specifies bit typeout mode, and sets the
	main bit name prefix to <prefix>.  The alternate prefix
	is set to the previous main prefix.  The pattern
	associated with the new prefix is the value of <prefix>
	in the symbol table, if it is defined;  otherwise, if
	"..B" followed by the prefix is defined, its value is
	used;  otherwise, the pattern defaults to 525252,,525252.
	How those settings are used is described
	in the special section "bit typeout mode".
	Note that symbols defined for use as prefixes are also
	good as masks for $t typeout mode.
	Especially useful prefixes predefined in DDT are
	.R, .S, ..R, and ..S.  If you have a .SUSET or .USET word
	that is positive (reading), just do .R$?? to see what
	variable is being read.  For a writing .SUSET or .USET,
	use .S$??.  ..R and ..S are good for .BREAK 12's.
$<pat>?	temporarily selects bit typeout mode, and sets the
	pattern for the main bit name prefix to <pat>.
<prefix>$<pat>?
	the same as <prefix>$? $<pat>?.  Like <prefix>$? but uses
	<pat> as the pattern, rather than the value of <prefix>
	or 525252,,525252.
$0?	interchanges the main and alternate bit name prefixes.
	When combined with a <prefix>,
	this exchange happens first, so
<prefix>$0?
	sets the main bit name prefix,
	without changing the alternate one.

$$?	permanently selects bit typeout mode.
	$$? interprets arguments otherwise the way $? does.

@	complements the indirect bit in the word in
	which it appears.  Is otherwise invisible
	(see parentheses not preceded by operator).

$A or $$A
	temporarily or permanently selects absolute address
	typeout mode;  that is, addresses will be typed as
	numbers (see $R).  Temporarily or permanently deselects
	bit typeout mode.

$B	and variants manipulate breakpoints:
$B	legal if the current job is stopped at a breakpoint;
	removes that breakpoint.
<loc>$B
	sets breakpoint at location <loc>
	up to 8 breakpoints may be set.
<loc>$<n>B
	(where <n> is between 1 and 8)
	sets breakpoint <n> at <loc>.
	If breakpoint <n> had been set, it is removed first.

$<n>B	the pseudo location which is the first
	of a 3-wd block describing the breakpoint
	the 2nd wd holds the conditional instruction;
	the 3rd, the proceed count)

<adr>,,<loc>$B
	sets a breakpoint at <loc> that will type out and
	open <addr> when it is reached by the program.
<loc>$0B
	removes any breakpoint set at <loc>.
0$<n>B
	removes breakpoint <n>.
$$B
	removes all breakpoints from the current job.
<loc>$$B
	sets an auto-proceeding breakpoint at <loc>.
	When an auto-proceeding breakpoint is hit,
	it prints the usual information, but does not
	stop the job unless the user types a character.
<loc>$$<n>B
	sets breakpoint <n> at <loc> and causes it
	to be auto-proceedng.

$C or $$C
	temporarily or permanently selects Constant typeout mode.
	When a location is opened, its contents will be typed
	out as a number in the current radix.

$D or $$D
	temporarily or permanently selects decimal typeout of
	numbers.

$E or $$E
	temporarily or permanently selects E&S instruction
	typeout mode.

<n>$E	searches current program for locations with effective
	address of <n>.  Starts at addr in lh of ..LIMIT .
	Stops at addr in RH of ..LIMIT .
	Typing a ↑D will stop the search, leaving
	"." set to the last location found.
<loc>$,<n>$E
	searches for such locations after <loc>, stopping at RH(..LIMIT).
<loc1>$,<loc2>$,<n>$E
	searches for such locations from <loc1> to <loc2>.
	When such a location <locx> is found,
	<locx> /   <contents-of-locx>  	is typed,
	and "." is set to <locx> (the ring buffer is pushed)

$F or $$F
	temporarily or permanently selects floating point
	typeout mode.  The contents of locations opened will be
	printed as floating point numbers.

$G	starts the program at the starting address
	(which is contained in ..STARTA).
	The previous PC is put in ..XECP (a DDT location)
	in case the program wishes to examine it.

<loc>$G	starts the program at <loc>.

<loc>$$G
	starts the program at <loc>,
	and make <loc> the default starting address.

$<n>G	does <n>↑↑ starting from the job's starting address.
	However, the 1st insn to be stepped through is printed
	and might be stopped before if the stepping flags say so.
	(↑↑ would not print the 1st insn or stop before it)
	Note that $0G merely sets the PC and prints the first
	instruction to be executed - it executes nothing.

<loc>$<n>G, <loc>$$<n>G
	are analogous.  <loc>$0g sets the PC and types the insn there.

$H or $$H
	temporarily or permanently selects half-word typeout mode.
	The contents of locations opened will be typed as
	two addresses separated by ",,",
	each address being the contents of one half-word.

<loc>$<n>I
	sets the MAR at location <loc>.
	If <n> is 1, a trap will occur
	on fetching an instruction from <loc>;
	if <n> is 2, on writing in <loc>;
	if <n> is 3, on any reference to <loc>.
	DDT will print MAR; pc>>instruction
	showing the instruction that tripped the MAR,
	before printing the next instruction to be executed.
	(as always).  They may or may not be the same,
	since the MAR may or may not abort the instruction
	that trips it.
	Note that the MAR may be made conditional
	by putting a nonzero instruction in ..MARC,
	and an arbitrary string of commands may be executed
	whenever the MAR is tripped by putting the string in
	the job's core and its address in ..MARX.
	Both ..MARC and ..MARX are cleared by the $I command
	to prevent confusion.
	Each job has its own MAR, and its own copy of
	all the related DDT variables.
<loc>$I
	same as <loc>$3I

$I	un-sets the MAR in the current job.

<name>$J
	makes job <name> the new current job.
	If no such job exists, one is created
	(In that case, "!" is typed out).
	If a disowned job exists, it is reowned,
	and ":$Reowned$" is typed.
	If $U has been used to tell DDT to open another user's
	job and no job exists with the spec'd name,
	a "No Such Job?" error happens.

$J	switches the current job in a "convenient" way.
	If there is a job waiting to return, it will
	be selected and will be able to return.
	If no job needs attention, $J
	will set the current job to the next job
	in a cyclic order going through all jobs.
	The name of the newly selected job will be typed out.
	If the job reached is another user's job that was being
	examined and which went away in the meanwhile,
	DDT will purge itself of the memory of the job,
	type :KILL and try to open the next job in order.

$<n>J	pops the job-selection ring buffer <n> times.
	Whenever a job is selected by any command other than
	$<n>J, it is also pushed on the job selection ring buffer
	(which is internal to DDT), so that $<n>J can be used to
	retrace the recent history of job selection.  $<n>J
	is most useful in valret strings which wish to reselect
	the job which did the valret after temporarily selecting
	other jobs, without having to make any assumption about
	the jname of the valretting job.  For example, one could
	do debug$j, hack around, and return with $1J.  One
	could also create a new job with :NEW TECO <commands>,
	and on exiting from the teco do :KILL $2J to return.
	The "2" is because the :NEW TECO pushes once, and the
	:KILL pushes again.  $1J $1J could not be used, since
	the first $1J would try to pop to the no-longer-existing
	TECO, which is an error condition.

<name>$$J
	set current job's name to <name>.
	This doesn't switch jobs;  it gives the same job
	a different name.  The job's XJNAME is not altered.

$$J	types the current job's UNAME, JNAME, state,
	and system index.  See $$V.

$K	is used for killing symbols:
<sym>$K	half kills symbol <sym> in the current job's symbol
	table.  When a symbol is half-killed, DDT will no longer
	use it for type out, but it is still recognized when
	typed in.
<sym>$$K
	fully kills the symbol <sym>, which will no
	longer be accepted as input.

$$K	kills all symbols of the current job.

$L <file>
	loads <file> into the current job's core image.
	Zeroes the core, kills the symbol table,
	and closes I/O channels before loading.
	Temporary breakpoints set by $↑N are flushed
	but ordinary breakpoints set by $B are not.
	DDT remembers the name of the last
	file loaded or dumped in each job,
	and uses it to default any names not given
	explicitly in <file>.
	The name specified becomes the new default
	for the next command.
	$L, $$L, $Y, $$Y, :DUMP, :LOAD, :PDUMP, :SL,
	:SYMLOD, :SYMADD and $↑K all use this default.
	when a job is created by <name>$J, the default is
	initialzed  	DSK:<msname>;<name> BIN   .
	when a job is loaded into by <prgm>↑K, etc.
	the default is set to the name of the file loaded.

<arg>$L <file>
	loads with an offset of <arg>.  That is, anything that
	should load into <loc> loads into <loc>+<arg>.
	doesn't work for :PDUMP'd files.

$0L <file>
	like $L but rather than loading a binary program simply
	reads the contents of the file directly into core.
	"." is set to the first location not read into,
	so that "↑" will open the last word read.

<arg>$0L <file>
	reads into core starting at <arg>.

$1L <file>
	like $L, but doesn't load symbols.

<arg>$1L <file>
	loads starting at <arg>, without symbols.

$$L <file>
	as $L but does not zero core, kill
	symbols, or close I/O channels.
	Can't be done to a running job.

$$0L <file>
	analogous.

$M	pertains to word-search comparison masks:
<mask>$M
	sets mask number 0 used for $W and $N searches to <mask>.
	Only those bits that are on in <mask> will be compared.
	The mask is initially -1.
<mask>$<n>M
	sets mask number <n>.  <n> must be from 0 to 7.
	Each search may speecify any one of the 8 masks.
	Thus, after (17)$1M 17,$2M, $1W will compare the index
	field and $2W will compare the AC field.
	Initially, $1M is 777777;  $2M, 777777,,;  $3M, 17,;
	$4M, (17);  $5M, (777000);  $6M and $7M are -1, like $0M=$M.

$<n>M	is the pseudo-address of the word in DDT which holds
	mask number <n>.
$M	is the same as $0M.

$N:
<word>$N
	searches for locations whose contents differ from <word>
	in one of the bit positions which are selected by <mask>,
	where <mask> is what is in $M (set by <mask>$M).
	Locations found are opened in the current mode
	and pushed on the "." ring buffer.  The range searched
	starts at LH(..LIMIT), and stops at RH(..LIMIT)
	(see the $E command).

<word>$<n>N
	where <n> is between 0 and 7, uses mask number <n>
	(the contents of $<n>M, set by <mask>$<n>M).
	If <n> is not between 0 and 7, <n> itself is used
	as the search mask.

<loc>$,<word>$N
	searches starting at <loc>.

<loc1>$,<loc2>$,<word>$N
	searches from <loc1> to <loc2>.
	<loc1> and <loc2> may be addresses inside DDT, in
	which case DDT will search through itself.
<loc2>,,<loc1>$,<word>$N
	does the same thing.  In <loc2>,,<loc1>$,<loc3>$,<word>$n,
	<loc3> overrides <loc2>.

$O or $$O
	temporarily or permanently selects octal typeout
	of numbers.  See $<n>R.

$P	proceeds the current job, giving it the TTY.
	If it is running, gives it the TTY.
	If it is waiting to return, allows it to return.
	 If its reason was that it needed the TTY or that
	 it wanted to valret, it is proceeded.

<n>$P	unless the current job is stopped
	at a breakpoint, identical to $P.
	Otherwise, sets the proceed count for the breakpoint that
	stopped the job to <n>.  ($P sets it to 1 in that case)
$$P
	like $P but if job was stopped at a breakpoint,
	sets that breakpoint to auto-proceed.

$Q	this has the value of the last quantity which either
	1) DDT deposited in a location or
	2) DDT found in a location that was opened or
	3) DDT was specifically told to type out
	  (by =, $=, ', ", ;, $;, $$;, ←, etc.)

$$Q	is $Q with its halves swapped; <($Q)>.

$0Q	identical to $Q.
$1Q	next-to-last value of $Q.
	(and so on up to $7Q)
$$<n>Q	$<n>Q with its halves swapped.

$R or $$R
	Temporarily or permanently selects relative
	address typeout mode, and deselects bit typeout mode.
	Addresses will be typed as <symbol>+<offset>
	when possible.  The symbol whose value is closest to
	the address is used.  The maximum <offset> allowed
	is kept in ..SYMOFS;  an address requiring a larger
	<offset> is typed numerically.
	Symbols in current or containing blocks and programs
	are preferred to symbols in other blocks or programs
	if they have the same value.
	The alternative is absolute mode ($A)
	in which addresses are always typed out as numbers.

$<n>R or $$<n>R
	temporarily or permanently selects output radix <n>.
	Input radix is always 8 (or 10. for numbers ending in ".").

$S or $$S
	temporarily or permanently selects symbolic typeout mode.
	Locations that are opened will have their contents
	printed in the way DDT thinks is most reasonable
	(usually as an instruction or in halfword format.)
	When an address is typed, it may be numeric or symbolic
	according to the $A vs $R selection.

$T or $$T
	temporarily or permanently selects typeout as bytes,
	using the most recently specified byte size or pattern.

$<n>T or $$<n>T
	(where <n> is between 1 and 36.)
	temporarily or permanently selects typeout of words
	as several bytes of <n> bits each.

$<pattern>T, $$<pattern>T
	(where <pattern> is negative)
	temporarily or permanently selects typeout of words
	divided into bytes according to <pattern>.
	The block of consecutive 1's at the front of <pattern>
	determines the first byte;  the block of 0's following,
	the second;  the next block of 1's occupies the third, etc.
	Each word to be typed out is divided up in that way
	and each byte is typed in the current radix.

<user>$U
	Logs in as <user>.  If <user> is logged in elsewhere,
	<user>0, <user>1, etc. are tried until one succeeds.
	Then, a :INTEST (which see) is done to initialize things.
	$U puts 0 in ..CLOBRF and in ..MORWARN, on the theory that
	anyone who uses $U (as opposed to :LOGIN) must be a winner.
	If <user>$U is typed when already logged in, it does not
	actually log in as <user>, but it does allow <job>$J
	to select <user>'s jobs (for examination only).

$U.	(point required)
	reloads and re-initializes DDT.  All inferiors are destroyed.
	If there are any running inferiors, DDT will type
	"--Kill Running Inferiors--", and read a character from
	the TTY.  If it is a space, DDT will go ahead;  otherwise
	it will type "Flushed" and do nothing.
	If you were logged in, you remain so, and if you have
	a .DDT. (INIT) file, DDT will type --Init-- and the file will
	be :XFILE'd iff the next char you type is a space.

$$U	logs out (you need not be logged in).  Console becomes free.
	If a file <xuname>;.DDT← (INIT) or (INIT);<xuname> .DDT←
	exists, it will be :XFILE'd before logging out.
	(Note that DDT will look on (INIT);  only if <xuname>;
	doesn't exist).  The file need not have in it a command
	to log out.
	If there is no such file, DDT will do a :OUTTEST<cr>
	as a default action, and then log out.
	(In other words, check for running inferiors (see $U.), delete
	the files COM:<xuname> OMAIL (or DSK:<xuname>;<xuname> OMAIL
	if the user has a directory), COM:<runame> SENDS and
	<xuname>;<xuname> OMAIL if they exist, and clear the screen).
	Many people link their .DDT← (INIT) files to STAN.K;ML EXIT
	which types a friendly, humorous message when they log out.
$$0u	is similar to $$u, but always acts as if there were no
	.DDT← (INIT) file.  It is always performs $$U's default
	actions.  It is useful when the .DDT← (INIT) file runs
	into trouble when it is executed.
$$1U	logs directly out.  Does not run the .DDT← (INIT) file,
	and does not do the default actions (:OUTTEST) either.

$V	manipulates the current job's "raid registers"
	(also redisplays them):

	Each job has several "raid registers", each of
	which may be used to display automatically the
	contents of one location.  Each time the job
	returns to DDT, its raid registers are displayed
	at the top of the screen.  Each raid register
	remembers one typeout mode and always displays
	its location that way (each location is also displayed
	as a constant in the remembered output radix).
	See also :RAIDFL which turns off all of a job's raid regs,
	and ..RAID, which starts a block of 3 words that are
	global parameters controlling raid registers.
	See also :RATE and :ATB which set up special sorts
	of raid registers for observing real-time rates
	of incrementation of counters, etc., and :RAIDRP
	which redisplays the raid registers continually
	with a fixed time interval.
<addr>$V
	set any free raid register on <addr>.
	If there was already a raid register set on <addr>,
	it is freed up first.
	The current typeout mode is remembered in the raid
	register that is set.

	<addr> may be indexed or indirect, in which case
	when the raid register is displayed the effective
	address will be calculated and the addressed location
	opened, displaying as  <addr> -> <e.a.>/  <contents>

	<addr> may be a .USET variable such as .PIRQC, or
	a DDT location such as ..UPI0.
<addr>$0V
	free the raid register set on <addr>.  If there is
	more than one, only the lowest-numbered is freed.
<addr>$<n>V
	sets raid register <n> on address <addr>.
	With this command it is possible to have more than
	one raid register set on a single location.
-1$<n>V
	free raid register number <n>.
$<n>V
	store the current typeout mode into raid register
	<n>, without changing the address it is set on.
$V
	redisplays the raid registers without changing them.
$0V
	toggles the switch ..RAID, which controls whether the
	raid registers are displayed automatically when the
	job returns.  When ..RAID's contents are nonzero,
	automatic display is enabled.  When they are zero,
	the raid registers are displayed only by $V commands.
 
$$V	lists jobs that DDT knows about,
	along with their states:
	for each job, one line is typed as follows:
	<uname> <jname> <state> <system-index>
	(where <uname> will be omitted if the job is DDT's inferior).
	The current job will be identified by a "*".
	<state> is as follows:
	P => proceedable (after a random interrupt).
	R => running.
	W => waiting to return to DDT ("needs attention").
	- => just loaded.
	<n>B => broken on breakpoint <n>.

$W:
<word>$W
	searches for locations whose contents coincide
	with <word> in those bits that are set in the mask.
	Since the number of the mask is not specified, mask number 0
	(the contents of $M, which may be set by <mask>$M) is used.
	The locations found are opened and typed inthe current mode.

<word>$<n>W  and  <loc>$,<word>$W  and  <loc1>$,<loc2>$,<word>$W
	and <loc2>,,<loc1>$,<word>$W are
	analogous to similar uses of $N.

$X	executes a specified instruction:
<ins>$X
	executes instruction <ins> in the current job's
	core image.  Not allowed if the job is running.
	Types 2 CR's if <ins> does not skip, 3 if it does.
	If <ins> is a DDT-reference (eg. SETZM ..TTYFLG
	or SETZM :DDTSYM TTYFLG) the insn is executed in DDT.
	While the instruction is executing, the PC before
	the $X is remembered in ..XECPC.

$Y <file>
	dumps the current job's nonzero core locations as <file>.
	Uses and updates the same default as $L (but if the default
	directory was SYS:, DSK:SYS1;, or DSK:SYS2; because the job
	was loaded by a ↑k or :<prgm>, they will be changed
	to DSK:<msname>; before the filespec in the $Y is processed.
	This will not be done if SYS:, SYS1; or SYS2; is
	explicitly specified by the user).
	If you quit out of a dump, a file ←DUMP← OUTPUT will be
	left.  A previous file with the names being dumped under
	will not be clobbered.

<loc1>$,<loc2>$Y <file>
	dumps core from <loc1> to <loc2>

$0Y <file>
	writes core out into a file direclty, without formatting.
	($Y dumps as a binary program)

<loc1>$,<loc2>$$Y <file>
	and other combinations of the above are analogous.

$$Z	zeroes core of this job.  If the job's ..SAFE is nonzero,
	asks --Zero Protected Job-- before zeroing.

<loc1>$,<loc2>$,<word>$$Z
	sets core from <loc1> to <loc2> to <word>.

[	is like / but types out as a number, rather than
	in  the current mode.
<arg>[, $[, <arg>$[, $$[, and <arg>$$[
	are like the corresponding / commands, but type the word
	opened as a number.

\	opens the location addressed by $Q's RH except:
	does not set "." or push the "." ring buffer.
	thus, linefeed will open 1 +
	the last location opened other than by \ .

<arg>\	deposits <arg> in the open location, if any,
	then opens the location addressed by the RH of <arg>
	in the same way \ opens a location.

$\ and <arg>$\
	are similar, but open the LH of $Q or <arg>.
$$\ and <arg>$$\
	do a PDP10 address calculation on $Q or <arg>.

]	is like / but types out in symbolic mode
	rather than the current mode.

<arg>], $], <arg>$], $$], <arg>$$]
	are all analogous to the corresponding forms of /.

↑	types the value of and opens .-1, on a new line.
	sort of the opposite of linefeed.

<arg>↑	stores <arg> in the open location, then does ↑.
$↑	pops the "." ring buffer, then does ↑.
<arg>$↑	stores <arg>, then does $↑.
$<n>↑	pops the ring buffer of "." <n> times, then does "↑".
<arg>$<n>↑
	stores <arg>, then does $<n>↑.

←	retypes $Q in symbolic mode.
<arg>←	retypes <arg> in symbolic mode.

$←	left-shifts.  Like ← in MIDAS.  Priority 3.
$$←	floating scales.


(More info on next page)
Colon commands:

    A colon immediately preceded by a symbol defines the symbol.
"$:" and "$$:" select programs or blocks in the symbol table.
Otherwise, those operators are escapes that begin
"colon-commands".  The colon is normally followed by the name
of a command, which may be built into DDT or may just run
a system program.  After the name come the arguments, if any.
Note that many programs usually run in this way are popularly
thought of as "DDT commands".  However, only the actual built-in
DDT commands are specifically described in this file (on the
next page).  The general workings of colon commands that run
programs are described on this page, but for the format of
their arguments the documentation of the individual programs
must be consulted.

There are the following special hacks:
1) an altmode after a colon starts a comment.  Everything from
the altmode to the next altmode, inclusive, is ignored.
For example, :$ FOO $PRINT BAR<cr> is the same as :PRINT BAR<cr>.
2) :<cr> does nothing but close the open location
(There may be a comment between the : and the <cr>).
Anything else runs either a built-in command or a program.


Colon commands to run programs:

1)  :<prgm><cr>	where <prgm> is not the name of any
built-in colon command, tries to run the program named <prgm>.
It looks for   TS <prgm>  on DSK:<msname>;, on SYS;,
then on SYS1;, then on SYS2;,
and then on all the user directories in the sname search list
if it is enabled (see :NFDIR).  If the file is found,
it is loaded without symbols into the job named <prgm>
(which will be created if necessary)
and started at its normal starting address.
The job's command buffer will be cleared.
If the job already existed (was not created fresh by :<prgm>),
:<prgm> can behave either like :NEW <prgm> or like
:RETRY <prgm>, depending on ..GENJFL's contents.
If ..GENJFL is zero, :RETRY <prgm> is done:
the pre-existing job is used for running <prgm>,
thus overwriting any data that was in that job already.
However, before doing this, if ..CLOBRF is nonzero,
DDT will ask for confirmation
by saying "--Clobber Existing Job--".  A space means "yes".
If ..GENJFL is nonzero, as it by default, :NEW <prgm>
is done;  the old job is left alone and another job is created
for the purpose of running <prgm>.
See :NEW and :RETRY, below, on this page.

In any case, the .XJNAME of the job will be <prgm>.
Programs that want to be runnable under many names and see which
name was actually used should check their .XJNAME.

2)  :<prgm> <text>	is similar, but provides <text>
as an argument to <prgm>.  As above, <prgm> must not be
the name of a built-in command.  Also, <text> must end with
a <cr> or "↑C" or "↑←".  <text> is put in DDT's command
buffer for the job <prgm> (instead of zeroing the buffer,
as :<prgm><cr> does).
Programs should read the command buffer with .BREAK 12,
and interpret the contents in a useful way (eg, as commands).
For example,  :MIDAS FOO<cr>  will run MIDAS
and tell it to assemble FOO >, giving FOO BIN .

3) :<dev>:<prgm><cr>	runs <dev>:<msname>;TS <prgm>
in a job named <prgm>, zeroing the command buffer.
It does not matter if <prgm> is the name of a built-in
command when a device is explicitly specified.
The job's $L default filname is set to
<dev>:<msname>;TS <prgm>.

4) :<dev>:<prgm> <text>	is similar but puts <text>
in the job's command buffer.  <text> is terminated by
a carriage-return or "↑C" or "↑←".

5) :<user>;<prgm><cr>	is like 3) but uses file
DSK: <user>; TS <prgm>.

6) :<user>;<prgm> <text>	  figure it out.
:<dev>:<user>;<prgm><cr>	    "
:<dev>:<user>;<prgm> <text>	    "

7) $: and $$: may be used instead of just : in all the
patterns described above.  They suppress built-in
commands, and always try to run a program.  In addition,
$: causes the program to be loaded with symbols.
$$: suppresses even the commands :NEW and :RETRY, but
$: causes them to load the programs specified to them
with symbols.

8) :NEW <prgm><cr>
is similar to :<prgm><cr>, except in what happens when
a job named <prgm> already existed.
In that case, instead of destroying its old contents, a new
job with an incremented (with :GENJOB) name will be created.
Thus, :NEW T<cr> when a job named T existed will create job T0;
another :NEW T<cr> will create job T1.

In any case, the .XJNAME of the newly created job will be <prgm>.
Programs that want to be runable under many names and see which
name was actually used should check the .XJNAME.

:NEW suppresses built-in commands, so that, for example,
:NEW DUMP<cr> will load a new copy of DUMP, like $$:DUMP
(whereas :DUMP by itself is a built-in command).

:NEW may be combined with the other options, as in
$:NEW MC:SYS;MACSYM command-string<cr>

9) :RETRY <prgm><cr>
is similar to :<prgm><cr>, except that if a job named <prgm>
already exists a clean copy of ts <prgm> will be loaded into
it, clobbering any data from the previous invocation of <prgm>.
Even if ..CLOBRF is nonzero, DDT will not ask for confirmation,
since the :RETRY is taken to mean that clobbering is desired.

:RETRY suppresses built-in commands like :NEW (see above).

:RETRY may be combined with the other options, as in
$:RETRY MC:SYS;MACSYM command-string<cr>


(More on next page)
Built-in colon commands:
  (NEVER invoked by altmode-colon or altmode-altmode-colon)

:ALARM <hr>:<min>:<sec>
	(where <hr>, <min> and <sec> are decimal numbers and
	a <cr> instead of a colon causes all the following
	fields to be taken as 0)
	sets an alarm at the time specified.
	DDT will type bells and a message every 20 seconds
	from that time on until the alarm is cleared.
:ALARM<cr>
	clears any alarm setting.

:ASSIGN
	assigns the dectape which is the current ↑F default device.
	If that device isn't a dectape, it is an error.
	Dectapes must be assigned to be used.
:ASSIGN <tape>
	assigns that dectape.  <tape> may be a number or a device name.
	That dectape becomes the default device, as with <tape>↑F.

:ATB <addr>
	sets a raid register to display the average
	time between increments of the contents of <addr>.
	Each time the raid register is displayed it will
	show the average over the time since the previous
	display.  See also :RATE, which will show
	the average rate of change.  :RAIDRP is likely
	to be useful with this command.

:ATTACH
	makes the current job replace DDT in the job tree.
	DDT and its other inferiors cease to exist,
	and the inferior attached takes on DDT's JNAME.

:CHUNAME <newuname>
	changes your UNAME to <newuname>.  Kills all jobs
	(typing "$$↑X." if there are any jobs to be killed).
	Then, optionally resets all user-options by reloading DDT
	(it offers "--Reset All--").
	Then, does a :INTEST, to attach <newuname> HACTRO
	or run <newuname>'s init file or whatever.

:CLEAR
	clears the screen on graphics TTYs.  Useful in files and valrets
	since ↑L is ignored in them.  Although when the TTY is in scroll
	mode DDT usually forbears to clear the screen, :CLEAR forces
	the clear to be done even in scroll mode.

:COPY <file1>,<file2>
	copies <file1> as <file2>.
	I/O is done in ASCII block mode.
	(For DSK, AI, ML, MC, DM and archive devices that is the same as
	image block mode, so will work for any files on those devices.)

:COPYD <file1>,<file2>
	copies <file1> as <file2>, preserving the creation-date.
	In addition, the real file names of <file1> are used as the
	defaults for <file2>, so that :COPYD AI:FOO >,ML:
	will preserve the FN2.  If a <cr> is used instead of a
	comma, the new defaults will be typed out before <file1>
	is read.

:DDTMOD
	leaves monit mode.

:DDTSYM <sym>
	evaluates one of DDT's own symbols (NOT one of the current
	job's symbols.  That needs no special command).
	The value is returned as a pointer into DDT.
	The character terminating <sym> is re-read.
	Thus, :DDTSYM TTYOPT/ will open location TTYOPT in DDT.

:DELETE <file>
	deletes <file> .  Uses and updates the same default name
	as :PRINT, etc.  See "filename reading" and "filename defaulting".

:DESIGN
	deassigns the dectape which is the current ↑F default device.
	If that device isn't a dectape, error.
:DESIGN <tape>
	deassigns that dectape.  Sets defaults like <tape>↑F.

:DETACH
	detaches the entire tree from the console, which becomes free.
	The tree becomes disowned.  It can be reconnected to a
	terminal with the REATTACH program, or it can be reowned
	with $J.  If the same user logs in again, DDT will
	automatically offer to attach the detached tree.
	If the JNAME of the top-level job being detached is HACTRN,
	it will be incremented at least once, and again until it
	is unique;  thus, it will become HACTRO or HACTRP, etc.
	:DETACH is illegal if not logged in.

:ERR<cr>
	prints out the error message associated with the last
	IOC error or open or symbolic system call failure
	in the current job.

:ERR <chnl>
	where <chnl> is a channel number, prints out the error
	message associated with the last error on that channel.

:ERR <code>
	prints out the error message associated with the status
	word <code>, where <code> might be obtained, for example,
	by opening .IOS+<chnl>.

:EXISTS <file>
	returns 0 iff <file> can be opened, else the I/O status word
	containing the open failure code.
	Uses the same defaults as :PRINT, etc.
	Useful with conditionals (:IF).

:FLAP
	flaps a dectape if it's the ↑F default device.
:FLAP <tape>
	flaps that tape;  sets defaults like ↑F.

:GAG <n>
	if <n> is 0, tells DDT to stop accepting :SEND's.
	Anyone who tries to :SEND to you will mail instead.
	If <n> is not 0, DDT will resume accepting messages.

:GENJOB
	rename the current job to a gensymmed name.  Programs may
	wish to valret a :GENJOB when they start up, to make sure
	that running the program a second time doesn't interfere
	with the first invocation.  :GENJOB does not print the new name.
	The new name is computed from the
	current name as follows: the first space in the name, or
	the last character if there is no space, is the incrementing
	position.  First, put a zero in that position;  if that name
	is in use put a 1 in that position, etc.  Loop incrementing
	that character until a name is obtained that is not in use.
	That name is the new name of the job.
	The .XJNAME variable is NOT changed.

:GZP<cr>
	starts the job at its starting addr without giving it the TTY.
	like $0G ↑P.

:GZP <addr>
	similar but starts at <addr>.

:IF <condit> <arg>
$( <conditionalized stuff> $)
	(where <condit> is one of "E", "N", "G", "L", "GE", "LE",
	and "MORE";  and <conditionalized stuff> is balanced in parens)
	skips up to the $) if the condition is false.
	↑B, ↑E, ↑V, ↑W are ignored in what is skipped.
	All the conditions except "MORE" compare the arg to 0.
	"MORE" enters a --More-- state waiting for a char to be
	typed in, and succeeds if the --More-- isn't flushed.
	(--More-- is not typed by this command.  If such a message
	is desired it should be typed before the :IF).
	The "MORE" conditional needs an arg but ignores it.
	To conditionalize something not balanced in parens,
	such as $1#(, use extra $('s and $)'s to make the parens match
	(since $( and $) are conveniently ignored by everything except
	false conditionals).
	Actually, a false conditional skips until the close-paren
	that matches the first open-paren.  The parens need not be
	part of $( and $);  doing that is only to make sure they're
	ignored if condition is true,which is usually right.

:INFLS
	flushes any pushed execute files and valret strings.

:INPOP<cr>
	useful when a valret or execute file was pushed;
	pops back into it.

:INPOP <line>	(where <line> ends with a <cr>)
	causes <line> to be executed as DDT commands, then pops
	back to a pushed execute file or valret.
	eg., :INPOP $P <cr>	will proceed the current
	job and pop into a valret or xfile.

:INPUSH
	useful in a valret or execute file;
	pushes that input source and allows input
	from the TTY, until a :INPOP command is given,
	after which input from the valret or file will resume.
	An :INPUSH command is executed automatically
	on any error in DDT, and whenever an inferior
	returns to DDT in any way that .RESET's TTY input
	(The only things which don't are:
	.BREAK 16,'s which specifically say not to,
	return from a ↑N, return from $X,
	and a .VALUE with nonzero arg, which will cause the
	file or valret in progress to be pushed while the
	new valret string is executed)
	When that happens, DDT will type ":INPUSH ".
	At those times, DDT will also turn on the typeout flag
	and type "↑V " if it had been off.

:INTEST
	performs the same actions that a
	$U command which succeeds in logging in takes,
	except that it doesn't log in.
	Those actions are:
	 if a job <runame> HACTRO exists,
	  and is running, DDT types
	  --Attach Your Detached Job--
	  and does so if the reply is a space.
	 Otherwise, DDT looks for an initialization file.
	  it looks for <xuname>;.DDT. (INIT) first.
	  If <xuname>; is not a directory, DDT looks for
	  (INIT);<xuname> .DDT., and, if that fails, for
	  the default initialization file  (INIT);* .DDT. .
	  If DDT succeeds in finding one of those files, it
	  considers :XFILE'ing it: if <xuname> = <runame>, DDT
	  just types "INIT" and :XFILE's it unconditionally, but
	  otherwise it asks "--Init--" and :XFILE's the init file
	  only if the user types a space.
	 Otherwise, if a file <xuname> MAIL exists on COM:
	  or <xuname>;, DDT types "--Mail--" and reads a character
	  from the TTY.  If that character is space, DDT prints
	  the file and renames it <xuname> OMAIL.
	 Also if there is no init file, if the user has a date-file
	 of the sort used by the :MSGS command (that is, if he
	 has ever done aa :MSGS), or if he has a directory,
	 a :MSGS command will be executed to print any new
	 system messages.  If there are any new messages, "--Msgs--"
	 will of course be typed before each one, and if the user's
	 response is other than space or rubout, DDT will leave the
	 messages for later.
	 If the automatic :MSGS is not done (user has no dir and
	 no date-file), the user will be informed of the existance
	 of the :MSGS command in case he is a new user.
	A special hack causes a :INTEST given in an execute file
	or valret string to pretend that there is no init file;
	it will always try to print mail and messages.  It is
	a useful thing to put in an init file to print mail
	and messages in the default manner as well as do other things.

:INTPRT
	analyses the value of $Q as a word of
	interrupt bits, printing out the names of the bits that
	are set, using the same names used when a job returns
	to DDT.  If the sign is set, the word is interpreted as
	2nd word interrupts;  otherwise, as 1st word interrupts.

:JCL<cr>
	clears the current job's command buffer.
	(the one that .BREAK 12, can read)
	Turns off the job's .OPTION variable's bit 4.6 (OPTCMD)

:JCL <line>	(where <line> ends with a <cr> or "↑C" or "↑←").
	puts <line> in the command buffer, including the
	terminating <cr> or "↑C" or "↑←".
	Sets the .OPTION variable's bit 4.6 (OPTCMD bit)

:JOB <name>
	like <name>$J except that there may be non-squoze
	characters in <name>.

:KILL	kills the current job, like $↑X.
	If the job is "protected" (its ..SAFE variable has
	been set nonzero), DDT will ask for confirmation before
	killing it.

:LFILE
	prints the name of the last file loaded into the current
	job (.BREAK 12, can also read this info).

:LINK <file1>,<file2>
	makes a link named <file1> pointing to <file2>.
	If a file named <file1> exists, :LINK will type an error
	message rather than delete the file.
	:LINK uses the same defaults that :PRINT, :DELETE, etc. use.
	(see defaulting of filenames) the defaults for <file2>
	will be <file1>.  After the :LINK, the defaults will
	revert to <file1>.
	(Actually, the names in <file2> are translated as if they were
	being opened,  and the translated names are used)
	(if <file2> is on a non-disk device, such as another machine,
	an error message occurs, unless <file1> is on the same device
	thus, it is possible to make links on job devices provided
	the job device handles the call correctly.  The AI:, DM:, MC:
	and ML: devices do win.)

:LINKN <file1>,<file2>
	is like :LINK, except no check is made that <file1> does
	not already exist.  Thus, :LINKN may be used to replace
	an existing file or link.

:LISTB
	lists all breakpoints set in the current job as follows
	<n>  <addr-to-open>,,<addr-of-bpt> <condit. insn> <count>

:LISTF <dir-spec> <cr>
	lists the specified directory.  A dir-spec may contain
	a device name followed by ":" and/or an sname optionally
	followed by ";".  It is terminated by "," or <cr>.
	altmode may be used as in file-specs.
	The specified directory becomes the default one for
	:PRINT, :DELETE, etc.

:LISTP
	prints the block-structure of the current job's symbol table.
	Each program is indented one space;
	each block, 2 or more according to its level.
	The entry for the global block comes first.
	Every block or program precedes its subblocks.

:LISTS	lists the names of all the symbols in the current job's
	symbol table.  Block and program names are flush against
	the left margin.  All others are in rows that start with
	two spaces.

:LISTU	lists all undefined symbol references
	(created by <sym>? ) in the current job.

:LOGIN <name>
	identical to <name>$U except that non-squoze chars may
	appear in <name> , and does not clear ..CLOBRF and ..MORWRN
	(ie, a user of :LOGIN is assumed to be naive).

:MONMOD
	enters monit mode, in which DDT generates a colon whenever
	it wants input at top level, except in valret strings
	and execute files.  This causes input to be taken as
	colon-commands.  Note that if you rub out one of those
	colons DDT will not replace it - you will thus leave
	monit mode temporarily, but any error will make DDT
	start generating colons again (for example, rubout when
	there's nothing to rub).

:MORE
	useful in execute files and valrets.  First, it turns on
	typeout by zeroing ..TTYFLG.  Then, it reads (and echoes
	on the TTY) a line from the file, then reads a
	character from the TTY.  If it is a space, continues with
	the file;  otherwise does a :INPOP<cr> .  One might want
	to put this before a command which clears the screen.
	A similar, more general feature is ":IF MORE".

:MSGS<cr>
	prints system messages.  It uses a file ←MSGS← <xuname>
	(kept on the directory of <xuname> if there is one;
	otherwise, on ←MSGS←;)
	to remember when it was last given, and prints only
	such messages as have appeared since that time.
	If there is no such file, DDT will print all the
	messages on the system.  In either case, the messages
	are printed in chronological order.
	Before each message, DDT will type "--Msgs--",
	and read a character from the TTY.  Space or rubout will
	tell DDT to clear the screen and begin the message;
	anything else tells DDT to stop, and the remaining
	messages will not be seen until the next :MSGS command.
	DDT begins to print a message by printing its filenames,
	followed by the first line of text.
	After the first line of the message, if there is more,
	"--More--" will be typed, and a character read.
	Space will type the rest of the message, rubout will flush
	the rest and continue with the next message if there are more,
	anything else will be as after "--Msgs--".
	"↑S" typed in while DDT is printing a message will throw
	away the rest of that message only.
	↑G'ing out of a :MSGS is safe and will cause all the
	messages to be seen again.
	This command is automatically executed by :INTEST and on login
	unless you have an init file or don't have a ←MSGS← <xuname>
	on your directory(if you have one) or on ←MSGS←; .
	Note that :MSGS<cr> will see only messages intended for
	the machine that you are on, even though .MSGS.; will
	contain all machines' messages.  This is because :MSGS<cr>
	turns itself into :MSGS *AI<cr> when done on AI;
	:MSGS *ML, on ML;  etc.

:MSGS <kwd1>,<kwd2>,<kwd3>,...
	is like :MSGS<cr>, but prints only messages which have
	at least one of the specified keywords in the "distrib"
	field.  Messages with no distrib field are for everyone,
	so :MSGS with keywords will see all of them, too.
	The keywords so far defined are *AI, *ML, *DM, and *MC.
	A message's distrib field shows which machines it is
	"intended" for;  messages mailed to *ITS will have all
	four keywords.  Thus, :MSGS<cr> will see only the messages
	intended for the machine it is done on, but :MSGS *AI,*ML
	will see all messages intended for AI or ML, and can be
	run on any machine (even MC!).
	Someday additional keyword conventions may be implemented.

:MSGS *
	shows all messages, no matter which machine they are for.

:NEWTTY
	informs DDT that its TTY may have changed its characteristics.
	DDT will reinitialize all its info on what type of TTY
	it is using.  If the %TOROL bit is on (scroll mode is the
	default), DDT will enter scroll mode.  When in scroll mode,
	DDT never clears the screen.

:NFDIR <name1>,<name2>,<name3>
	(any number of names may be specified)
	enables the sname search list feature if not enabled,
	and puts the specified names, in reverse order, at
	the front of the list, which is searched front to back.
	a name appears only once in the list, which holds 8 names.
	When the feature is enabled, $L and ↑K look on all the
	directories in the list if the file isn't found on the default
	or specified directory.  If it is found on a directory in
	the list, the sname of that directory will be typed out,
	followed by a semicolon.  A separate list of the 8 most
	recently used snames is also searched.

:NOMSG <n>
	if <n> is 0, turns off all unsolicited typeouts by DDT.
	Alarms, and even system going down messages, are affected.
	The effect of :GAG 0 is implicit (and the :GAG setting is
	ignored when :NOMSG 0 is in effect).
	<n>=1 leaves this mode, and prints out the pending typeouts
	(a list of waiting jobs, etc.)  that couldn't be printed
	before.

:OFDIR <name1>,<name2>	(any number of names)
	removes those names from the search list.

:OFDIR<cr>
	disables the sname search feature and clears the list.

:OLOAD <file>
	loads files produced by old versions of STINK, a few of
	which can't be $L'd properly, because they had programs
	loaded into addresses above 400000 .  Files produced by
	recent versions of STINK and MIDAS never have this problem.

:OMAIL <user> <message>↑C
	** This command is semi-obsolete -- use the "MAIL" program **
	adds <message> to the front of <user>'s mail file;
	he will see it when he logs in (unless he has an init file
	which doesn't print his mail) or when he does :PRMAIL<cr>.
	When typing in the message, rubout deletes and echoes one
	character;  ↑G and ↑D cancel the message;  ↑L causes the
	characters typed in so far to be printed (after clearing
	the screen);  ↑C and ↑← end the message and cause it to be sent.
	(↑← is useful in xfiles since ↑C terminates them).
	 in the mail file, each note looks like:
		"
		<sender>@<machine> <date> <time> <message>
		↑←"

:OMAILA <user> <message>↑C
	** This command is semi-obsolete **
	adds to the note this user most recently mailed to <user>;
	that is, the message etc.  Is added not at the front
	of the mail file but just before the ↑← terminating the
	previous note.  If there is no note from this user
	in <user>'s mail file, the new note is added at the end.

:OMSG <topic> <message>↑C
	is the old way of mailing a message to all users.
	:MSG, which runs the mail program, should be used instead.
	:OMSG writes a file .MSGS.;<topic> > containing your runame,
	the date and time, and <message>.  :MSGS will print the
	file, so every user ought to see the message once.
	↑← may be used instead of ↑C.

:OUTTES
	performs the actions normally associated with logging out.
	It does not execute the .DDT← (INIT) file.
	:OUTTES always does what $$U and :LOGOUT do if there is no
	.DDT← (INIT) file (except that :OUTTES does not actually
	log out).
	specifically, it checks for running inferiors, querying
	"--Kill Running Inferiors--" if there are any (and causing
	an error if the query is flushed),
	deletes the files COM:<xuname> OMAIL(or <xuname>;<xuname> OMAIL),
	and COM:<runame> SENDS, and clears the screen.

:PDUMP <file>
	like $Y but does a "pure-dump" - all jobs which have that
	file loaded will share the pure pages in it.
	If you quit out of a pdump, a file ←DUMP← OUTPUT will be
	left.  A previous file with the names being dumped under
	will not be clobbered.

:PRGM
	prints the name of the currently selected block of symbols.
	If it is the global block, that's all.
	If it is a program, types ", program".
	Otherwise, prints ", level " and the block's level.

:PRINT <file>
	types the file's contents.  Uses the same default as :DELETE.

:PRMAIL
	prints your mail file (<xuname>;<xuname> MAIL if the
	dircetory <xuname>;  exists, otherwise COM:<xuname> MAIL)
	and renames it as OMAIL .  On display terminals, "No mail"
	is typed if no mail file exists.

:PRMAIL <user>
	prints <user>'s mail file if it exists;  else types
	"No mail".

:RAIDFL
	turns off all of the raid registers of the current job.
	The storage for them is deallocated, so their settings
	are all forgotten.

:RAIDRP <# secs>
	puts DDT in a loop redisplaying the raid registers
	of the current job every <n> seconds.  Typing any
	character will cause DDT to exit the loop and
	process the character.

:RATE <addr>
	sets a raid register to display the
	rate of change of the contents of <addr>.
	Each time the raid register is displayed it will
	show the average rate of change of the contents
	since the previous display.  See also :ATB which
	shows the inverse rate.

:REAP <file>
	sets <file>'s reference date to long ago, so that if automatic
	grim reaping is done <file> will be reaped.

:RENAME <file1>,<file2>
	renames <file1> as <file2> .  The device and/or sname may
	be specified in either filename.  Uses the same defaults as
	:PRINT, :DELETE, etc. <file2> defaults to <file1> .

:SEND <user> <message>↑C
	if <user> is logged in and has not done :GAG 0, prints
	"MESSAGE FROM <your-runame> HACTRN"
	followed by <message>, on his TTY,
	and puts it at the head of the file  COM:<user> SENDS .
	Otherwise, types "(Mail) " as soon as you have
	typed the space after <user>, and then runs the MAIL
	program to send mail to <user>.  See .INFO.;QMAIL ORDER
	for info on the MAIL program.

:SFAUTH <file>,<name>
	sets <file>'s author's name to <name>, which should be the
	name of some directory in the system.  This command works
	only on DM.

:SFDATE <file>,<date>
	sets <file>'s creation date to <date>.  <date> should have the
	same format as dates in dsk directories as typed by ↑F.
	(but trailing numbers omitted default to 0, except for
	the year, which defaults to the current year)
	:SFDATE uses the same defaults for <file> as :DELETE.

:SFDUMP <file>,<0 or 1>
	sets <file>'s has-been-dumped bit to <0 or 1>.  The dumped
	bit is supposed to be set for all files that have been
	dumped on mag tape.  "!" in directory listings marks
	the files whose dumped bits are 0.

:SFREAB <file>,<0 or 1>
	sets <file>'s inhibit-reap bit to <0 or 1>.  The DUMP program's
	automatic GFR will not delete files which have this bit set
	to 1.

:SHOUT <message>↑C
	sends the specified message to all logged-in users
	who can receive it.  Does not send or mail the message
	to users who are not logged in or are gagged.
	Also does not send or mail to the shouting user himself.
	As each user is sent the message, his name is typed
	out on the terminal of the DDT which is shouting.
	The actual message sent is
	<sender's uname> <time> Everybody: <message>
	but the automatically supplied parts can be rubbed out.

:SL <file>
	like $L but loads only the symbols, flushing any that are
	already defined in the current job.

:SLEEP <n>
	sleeps <n>/30. seconds.

:SNARF <job>
	if the current job (say, FOO) has an inferior named <job>,
	this command takes <job> away from FOO
	and then does ":JOB <job> ".  Thus, <job> becomes a direct
	inferior of the DDT executing this command, instead of
	an indirect inferior.  FOO is not told that its
	inferior is gone, but if it is a DDT it will recover
	after an $J is done to it.  This command is most useful
	when done to a HACTRO that got detached because of a top-
	level interrupt, but whose inferiors are valuable.
	(The thing to do is "HACTRO$J :SNARF TECO ", etc.)

:SSTATU
	prints system status info, as is done when DDT starts up.

:SYMADD <file>
	loads the symbols from <file>, without killing the
	symbols the current job already has.

:SYMTYP <sym>
	returns info on <sym>'s status.  Useful in conditionals
	since 0 iff symbol undefined.
	(the char. terminating <sym> is re-read)
	bits in value:
	 4.9 - sym is half-killed.
	 4.8 - sym is predefined in DDT.
	 4.7 - sym defined but not in current block.
	 4.6 - sym is a DDT-reference (like ..TTYFLG or ..BTAD)
	 4.5 - sym is a .USET reference (like .SNAM)
	 the RH has the sym tab entry's addr in DDT
	  (but is 0 for PDP-10 insns, which have none)

:TPL <file>
	causes <file> to be printed on the LPT: eventually.
	If <file> is on DSK:, makes a link from the TPL: device to <file> .
	<file> must exist when the attempt is made to print it;
	if it doesn't exist when the command is given it is an error
	(the names in <file> are translated as if it were
	being opened and the translated names are actually used).
	If <file> is not on DSK:, it is copied to the TPL:.
	On MC, device TPL just sends files to ML's TPL;  it can't
	hold links.  :TPL on MC will always copy the file.

:TPLN <file>
	like :TPL but no error if the file doesn't exist.
	If it still doesn't exist when the time comes to print it,
	ITS will wait till it does exist.

:UINIT
	zeroes directory on dectape that is ↑F default device.
	Error if that device isn't a dectape.
	The tape must be assigned first.
:UINIT <tape>
	similar but uses the spec'd dectape.
	Sets defaults as ↑F does.

:UNPURE <addr>
	unpurifies the page of the current job in which
	<addr> lies (thus, ":UNPURE 2000 " unpurifies page 1).
:UNPURE<cr>
	unpurifies all shared and read-only pages of the
	current job, except absolute pages.
	See the symbol "..UNPU" for the automatic unpurification feature.

:V	if read from the TTY, turns on TTY output by zeroing ..TTYFLG.
	In a valret or file, cancels one ↑W, just as a ↑V does.

:VERSIO
	prints the version numbers of ITS and DDT.
	Also says which machine you're on.
	If logged in, DDT prints its UNAME and JNAME on the next line.
	This command is executed automatically when DDT starts up.

:VK	turns on typeout like :V  and types a cr-lf and a *.

:VP	turns on typeout and proceeds inferior without
	actually typing anything.  Like $P↑V .

:WALBEG <file>
	opens a wallpaper file.  If successful, turns on output to it.
	The default file names are LPT:WALL PAPER <msname>;
	see ↑B and ..LPTFLG

:WALEND
	closes the wallpaper file if any.  Doesn't
	change ..LPTFLG but its contents become irrelevant.

:XFILE <file>
	executes <file> as DDT commands, after which input will
	revert to its current source.  The current input source is
	pushed as by :INPUSH and input comes from the file;
	at eof input will pop back into the source the
	:XFILE was read from.  However, if :XFILE is the last command
	in an execute file, it will be able to loop without
	input pdl overflow (the CRLF ending the :XFILE must
	be absolutely the last thing in the file!).

:?	prints the file .INFO.;DDT :CMNDS, which is a condensation
	of the info on this page of DDT order

(More on next page)
Reading of filenames:

   Some commands take filename arguments.  These arguments
always follow the command itself.  Such commands must always
be terminated by a carriage-return.

   An ITS filename has four components:  the device name,
the sname (or user name), and two filenames, the FN1 and FN2
(Yes, "filename" is ambiguous).
The device name and sname constitute the directory, and the
two filenames specify the file in it.  A filespec can specify
any or all of the components.  Those that are not specified will
be given default values, which will usually be whatever values
were used for those components in a previous command (see
Defaulting of filenames, on the next page).

   A filespec as understood by DDT is composed of names
terminated by delimiters.  A name is composed of any SIXBIT
characters which are not delimiters, except that delimiters
which are SIXBIT characters may be forced into names by preceding
them by ↑Q.

   The significance of a name depends on what the terminating
delimiter is.  If a name is terminated by a colon, it specifies
the device name.  A name ended by a semicolon specifies the sname.
In addition, it forces the default device name to be DSK:, if the
default device was one which does not use the sname (such as PTR:).
Names terminated by anything other than colon or semicolon
are "normal".  The first normal name specifies the FN1.
The second specifies the FN2.  If there are more normal names,
the third becomes the device name and the fourth becomes the sname.
Further normal names are ignored.

A normal name is usually separated from what follows by a space,
but a space is not needed before these special effect characters:

   ↑X	     like typing the default FN1 between spaces.
       (treats the preceding name if any normally,
       then treats the default FN1 normally)
       Thus, if the defaults are FOO BIN, typing TS↑X will
       specify TS FOO.
   ↑Y	     similar but uses the default FN2.

   , (comma)
       ends the file specification.  It does not terminate the
       command, however;  only a ↑M will do that.
       Useful in commands that read a file specification and
       then read something else.

   $ (altmode)
       Causes the filenames specified thus far to be typed
       out on a new line, followed by a tab.
       Then reads another file specification using
       the typed-out names as the defaults.

   ↑M (carriage-return)
       terminates the file specification and also
       terminates rubout-processing.  Unless the command wants
       to read more arguments, it will immediately execute.


(More on next page)
Defaulting of filenames:

   When a filename is read in, defaults are provided for any
element of the filename that is not specified.  Usually, the
names that are given explicilty change the default for the
next command of the same class (filenames are "sticky").
The commands are divided into classes as follows:

1) Loading and dumping commands
   $L, $$L, $Y, $$Y, :DUMP, :LOAD, :PDUMP, :SL, :SYMADD, etc.
These commands all remember and update the same filename;
however each job has its own.  When a job is created, that
default is set to  DSK: <msname>; <jname> BIN  .
When a job is loaded into by <prgm>↑K or :<prgm>, etc.,
the default is set to the name of the file loaded.
Each command in this class updates the default for the job
that it loads or dumps to the file that was loaded or dumped.
(that is, the next such command in the same job will use the
same filenames unless the names are explicitly re-specified).

2) ↑O, :DELETE, $↑O, :RENAME, :LINK, :SFDATE, :PRINT,
    :COPY, :EXISTS, :TPL, :LISTF, ↑F.
These commands all use and update the same default
filenames.  There is, however, only one default for these
commands rather than one for each job.
↑F is slightly special in that TTY↑F and <arg>$↑F do not
set the default for any of the other commands, but do set
it for successive ↑F's without argument.

3) ↑T, $↑T, $$↑T, ↑U, $↑U, $$↑U.
Defaults for these commands are not sticky between commands.
The first file's defaults are always *:*;* *.
With those commands that read two filenames (↑T, $↑T, $$↑T)
the second defaults to the first.

4) :XFILE remembers and updates its own special default.
So does :WALLP (that default is initially DSK:<msname>;WALL PAPER).

Setting the msname ($$↑S) sets the default sname for :XFILE, :WALLP,
:DELETE, etc., but not for $L, etc.


(More on next page)
DDT's UNAMEs:

DDT remembers several different "user names", each one with
its own significance.  They are, in order of decreasing
significance and increasing frequency of alteration,

 the RUNAME, the XUNAME, the MSNAME, the UNAME.

1) The RUNAME

The RUNAME is DDT's best idea of what its .UNAME user variable
is (in other words, it represents the fruits of DDT's attempts
to keep track of what the system thinks DDT's UNAME is).

DDT uses the RUNAME as the FN1 of the "SENDS" file to put
messages from other users in (see "Unsolicited typeouts"),
and also as the UNAME that inferiors must be created with.

It is unreasonable to change the RUNAME explicitly.  DDT tries
hard to detect any change in its .UNAME and update the RUNAME
as necessary (see "When DDT determines the RUNAME").

2) The XUNAME

This is "who you really are", as opposed to "what you are logged
in as".  It is not infrequent for them to be different.
The XUNAME lives in the DDT
variable ..XUNAME, and in DDT's .SUSET variable .XUNAME;
they are both set by logging in, and by depositing in ..XUNAME.
When you log in, the XUNAME is normally set to the name you specify,
even if you end up logged in under another name (for example,
if you say FOO$U and end up as FOO0 because FOO already existed,
your XUNAME will still be FOO).  However, if you try to log in
as "FOO1", and FOO1 has no directory, DDT init file, or ←MSGS← file
while FOO does, the XUNAME will be FOO instead of FOO1.

DDT uses the XUNAME as the name of the default mail file
for :PRMAIL, and as the name of the ←MSGS← file for :MSGS.
so, after "FOO1$U", you would see foo's mail and messages.
DDT also uses the XUNAME to decide whose init file to use.
If you would like to have different initialization
performed depending on whether you log in as "FOO" or "FOO1",
you can put conditionals in the init file as follows:
 :DDTSYM RUNAME/
 :IF E $Q-$1'FOO$
 $(  <commands executed only if you log in as FOO> $)
a similar conditional can then specify commands to be executed
only if not logged in as FOO - just use "N" instead of "E".

Each inferior job also has a .XUNAME variable.  When the job is
created, DDT will set its .XUNAME from DDT's XUNAME.  After that,
DDT will never touch it, but the user can alter it at will by
depositing in .XUNAME.  In addition, the DDT command $↑S can be
used to cause the next job created to be given a different .XUNAME.
Programs that read init files should use the .XUNAME to decide
where to look for one.  They should read their own .XUNAME
variables, rather than trying to read DDT's .XUNAME, so that
the user will be able to fake them out with $↑S, etc.

3) The MSNAME

"MSNAME" is short for "Master SNAME".  It is DDT's super-default
SNAME.  Whenever an inferior is created or reloaded,
its .SNAME variable is initted from the MSNAME.  Also, when DDT
is about to load a program into a newly created job (one not
loaded before), the MSNAME is the first directory DDT looks on
for the file (see $L, ↑K, :).

The MSNAME is set just like the XUNAME at login time.
It may be set explicitly by <name>$$↑S.  In either case, several
other default SNAMEs are also set.  Another way to set the MSNAME
is to deposit in ..MSNAM.  This has no other side effects.

4) The UNAME

The UNAME is what DDT uses as the UNAME when it tries to open
a job.  DDT may change it for various reasons, and will type out
"<new uname>$U" when it does so.  These reasons include
 reselecting an existing job - DDT will set the UNAME to that
  job's UNAME.
 creating an inferior - DDT will set the UNAME to your RUNAME
  in order to be able to create the job.

The UNAME is initted to equal the RUNAME, whenever DDT determines
the RUNAME.  It may be set explicitly by <name>$U, which has no
other effect in a DDT which is already logged in.  The reason
to do this is to open someone else's job for examination, or
for re-owning if it is disowned.


When DDT determines the RUNAME:

At various times, DDT checks its .UNAME system variable.
If it is not equal to the RUNAME, DDT sets the RUNAME, and
also initializes the UNAME.
This happens just after logging in.  Normally it will never
happen again, but if the DDT is detached or disowned, and
then reowned with a different UNAME, DDT will eventually
find out about it and redetermine its RUNAME.

(More info on next page)
Specially used symbols:

Symbols whose values are variables:
 (It is reasonable to assemble definitions of these to direct DDT)

PATCH	the address of the start of the ↑\ patch area.
	(If you use MIDAS block structure, you should
	define PATCH in the global block, by doing ' PATCH": ')
PAT	will be used to initialize PATCH if PATCH
	 isn't defined.  It is best to define both PAT and PATCH;
	 as patches are made, PATCH will change, but PAT will not.

..D010	if this is defined, something which looks like
	 an I/O-instruction with device code 010 will be
	 typed out in $S mode as an I/O instruction.
	 If it is undefined, such values will be typed  out
	 in halfword mode instead.
	 In general, for something with device code <dev>,
	 the symbol ..D<dev> is used.
	(Except that for devices APR,PI,TTY,DIS I/O-instruction
	format will always be used)
	(also, if there is no job, no symbols,
	or if the job is SYS, PDP6 or PDP10,
	the I/O-instruction format will be used for all
	device codes less than 740, without searching for ..D!dev)

..U010	if this is defined, it tells DDT what to do about
	UUO opcode 010 -- whether it uses its AC field, whether
	it addresses memory, etc.  This information is relevant
	when DDT is considering opening the memory locations
	referenced by a specific instruction (see ..PCPNT).
	..U symbols are looked for only for opcodes less than 100
	or greater than 700.  The value has 3 significant bits:

	1.1   this UUO refers to the addressed memory location.
	1.2   this UUO refers to the specified ac, unless the AC field is 0
	1.3   this UUO always refers to the specified ac.

..BFOO	is one place that DDT looks for the bit pattern, when
	FOO$? is done.  See $? for details.


Special pseudo-locations (.USET variables):
 These symbols have values which are the "addresses" of the current
 job's .USET variables.  Those .USET variables are not really in the
 job's memory, and these "addresses" are not just numbers, but it
 works to add numbers to them.
 For more accurate and detailed info on .USET variables,
 see .INFO.;ITS USETS.

.UPC	holds current job's PC.

.JPC	PC before most recent jump instruction.
	Unfortunately, proceding from a breakpoint
	clobbers this variable, and so does hitting a breakpoint
	which does not break because of its proceed count or
	conditional instruction.  There is unfortunately no easy
	way to fix this.

.UUOH	PC at last insn that trapped to system's 40 .
.SV40	last UUO that trapped to 40 .
.60H	PC at last insn that trapped to 60 .
.SV60	last insn that trapped to 60 .
.UTRP	set if system calls should trap to superior instead of normal action
	(DDT doesn't handle that specially)

.SNAM	job's default SNAME.  Initted by DDT from the MSNAME.
.UNAME	job's UNAME.
.XUNAM	job's XUNAME.  DDT inits it to your XUNAME (usually, but see $↑S),
	but you can change it to fool the program if you like.
.JNAME	job's name.
.XJNAM	job's "intended" name.
	Tries to do the same thing for a job's JNAME that .XUNAME
	does for the tree's UNAME - that is, it claims to be what
	the JNAME would ideally have been.  When a job is created by
	$J, the XJNAME is set up to be the same as the JNAME.
	If the JNAME is changed by $$J or :GENJOB, however, the
	XJNAME is not changed.  Also, if a job named FOO0 is
	created by :NEW FOO, the job's .XJNAME will be FOO, not FOO0.
	Programs that wish to take different actions depending on
	the user's command should examine this variable.
.UIND	job's user index (printed by $$J, $$V).
.SUPPRO	the job's superior's user index, or -1 if job is top-level.

.USTP	stop bits, nonzero => job not runnable.

.MASK	mask for 1st-word interrupts.
.IMASK	when read, like .MASK .  When written, IOR'ed into .MASK .
.AMASK	similar but ANDCAM'd into .MASK when written.

.PIRQC	pending 1st-word interrupts.
.IPIRQ, .APIRQ	analogous.

.MSK2	mask for 2nd-word interrupts.
.IMSK2, .AMSK2	turn on or off bits in .MSK2

.DF1	defer-bits for 1st-word interrupts.
.DF2	similar, for 2nd-word interrupts.
.IDF1, .ADF1, .IDF2, .ADF2 also exist.

.IFPIR	pending 2nd-word interrupts.
.IIFPI, .AIFPI	analogous.

.PICLR	0 => PI in progress
	-1 => PI cleared.

.MEMT	top of user memory (1+ highest legal address).

.MARA	address and bits set in MAR
.MARPC	last PC where MAR stopped program.

.BCHN	# of channel most recently in error.
	(the one whose status you might want to look at)

.MPVA	address of the 1st word of the page
	that the most recent MPV tried to refer to.

.RUNT	job's runtime in 4.069↑-6 sec. units.

.OPTIO	job's option bits.
	Bit 4.5 (OPTBRK bit) is set by DDT in all inferiors.
	The intention is that a superior should set it if it is
	prepared to handle all .BREAK 12's and .BREAK 16's as DDT does.
	Bit 4.4 (OPTDDT bit) is also set by DDT in all inferiors.
	No one else should set this bit.
	It is cleared in a job which is disowned.
	The system does not use these bit, or bit 4.6 (OPTCMD bit)
	which DDT will set iff there is a command available for the inferior.
	Inferiors should try to read a command from their superiors
	only if this bit is set.  That will facilitate running
	them under programs which can't handle .BREAK 12, at all.

.40ADDR	specifies the addresses of the special core locations
	used by DDT and I.T.S.  The right half points to a
	block used by I.T.S;  the left half points to a block
	used by DDT.

	The RH normally contains 40 .  Whenever the system references
	locations "40", "41" or "42" specifically, (eg
	giving the user interrupts, or returning UUOs 50-77),
	the system really references the 3-word block that .40ADDR
	points to.  Thus, if .40ADDR is set to 500, the system expects
	location 502 to contain the address of the interrupt handler.

	I.T.S. reserves an 8-word block, but uses only 5 words
	of it as of now.  The words used are (assuming the block
	starts at the default location, 40):

	   40	    when a UUO is returned, its value is
		     placed here.
	   41	    the address of the returnable UUO handler
		     should be here.  See ITS UUOS for details.
	   42	    holds the interrupt handler address or
		     interrupt table AOBJN pointer,
		     if there are interrupts enabled.
	   43	    holds the undo-list for the LOCKS feature
		     if the feature is turned on.
	   44	    holds the critical routine table pointer
		     if the LOCKS feature is turned on.


	If the LH is nonzero, it is the address of the 20-word
	block used by DDT.  If it is zero, the block starts
	at location 20 .  The uses of these locations are:

	   25	    holds "." when a user-defined typeout
		     mode instruction is run.
	   26	    holds a breakpoint conditional
		     instruction being executed.
	   27, 30   hold .BREAK 16's for getting control
		     back to DDT after a breakpoint
		     conditional instruction.
	   31	    holds an instruction being executed
		     to proceed from a breakpoint which
		     didn't break (count not out and
		     condition, if any, didn't skip).
	   32, 33   JRSTs back to the program, or
		     data for the instruction in 31.
	   34	    holds an instruction being $X'd
	   35, 36   hold .BREAK 16's to return to DDT
		     after the $X'd instruction.
	   37	    holds $Q when a user-defined typeout
		     mode instruction is run.

.TTY	contains several things uninteresting to examine when
	the job does not have the TTY, and also contains
	%tbint=100000,,	  if set, the job will interrupt on
			  any attempt to use the TTY when it
			  doesn't have the TTY.  DDT sets this
			  bit in all jobs it creates, but will
			  not object if you alter it.
	%tbnvr==200000,,  if set, TTY opens will fail when the
			  job doesn't have the TTY.  DDT initially
			  zeroes this bit, but you can alter it.
	%tbdty==10000,,	  not user settable, this bit is 0 iff
			  the job has done a .ATTY not undone
			  by a .DTTY.

.TTST, .TTS1, .TTS2
	hold the saved values of the TTYSTS, TTYST1 and TTYST2
	variables for the job's console, when the job doesn't
	own the console.

.TVCREG
	holds the job's "console register" that determines what
	TV it will write on when it deposits in the TV memory,
	and also what logical operation is used for depositing.

.CNSL	contains the number of the TTY of the job's tree,
	whether or not the job has the TTY.  Also, will be
	-1 for jobs "in the system tree" and -2 for
	disowned jobs.

.IOC	+<n> is contents of I/O channel <n>

.IOS	+<n> is contents of I/O status word for channel <n>

.IOP	+<n> is contents of I/O pdl word <n>

.PMAP	+<n> is "page-map word" <n> ;
	  see .INFO.;ITS USETS  for its format.


Special per-job pseudo-locations (DDT's user variables):
 These symbols have values that are the "addresses" of variables
 in DDT's memory, pertaining to the current job.  The visible
 numeric part of such an address is in fact the address of
 the variable in DDT, but there is also a hidden flag.

..UPI0	after the job interrupts DDT, this word says
	which fatal 1st-wd interrupts the job got to cause DDT
	to be interrupted.
..UPI1	holds the fatal 2nd-wd ints that the job had.
	when a job has interrupted DDT, either ..UPI0 or ..UPI1
	must contain nonzero (something must have stopped it!).

..PPC	PC to restart job at.

..XECP	holds the PC saved by the last $G or $X command.
	$X will (presumably) eventually restore that PC.

..UIWD	says why job stopped.
	-1 => random interrupt.
	0 => running.
	1 thru 8 => that breakpoint.
	16 => .BREAK 16,
	21 => never started.

..INCNT	number of insns to 1-proceed.
..OIPC	nonzero in $$↑N mode, in which case PC to stop at.

..USCNT	number of times to multi-step,
	negative => forever.
..USTYPE
	holds the job's stepping-flags.

..SAFE	usually zero.  If set nonzero by the user, the job is made
	"protected".  Any attempt to kill or reload a protected
	job will cause DDT to ask for confirmation.

..BTADR	0 => no temp. bpts in this job.
	else RH is addr of the 1st;  the second is in the next wd.
	If LH is from 0 to 17, it is addr of an AC whose contents
	should be compared with those of
..BTPDL	, breaking only if they are equal.

$<n>B	(<n> from 1 to 8) (either altmode or dollar sign is okay)
	1st word of a 4 word block describing setting of bpt <n>.
	zero if bpt <n> not set. else,
	RH as address of bpt, LH if nonzero is location
	to open when the breakpoint is hit.
$<n>B+1	nonzero if conditional breakpoint, in which case
	holds conditional instruction (break if insn skips)
$<n>B+2	holds proceed count for breakpoint.

..MARA	holds the MAR status.
	after <adr>$<n>I, ..MARA contains 4+<n>,,<adr>
	when there is no MAR set, ..MARA holds 0.
..MARC	the conditional MAR instruction.
	If this is nonzero, the MAR will break only if
	this instruction skips wheee executed in the job.
..MARX	if nonzero, this word is considered to be the address
	of the first word of an ASCIZ string to be executed as DDT
	commands whenever the MAR is tripped.

..STARTA
	0 if no starting address, else JRST to the address.

..LIMIT
	holds <default low search limit>,,<default high search limit>

..PERMIT
	-1 => job allowed to execute valret strings.

..TPERCE
	holds the % typeout mode for this job.  Initialized from
	..mperce when the job is created.  See ..TDOLLA for details.

..TAMPER
	holds the & typeout mode for this job.  Initialized
	from ..MAMPER when the job is created.  See ..TDOLLA.

..TDOLLA
	initialized from ..MDOLLA when the job is created,
	it holds the job's $ (dollarsign) typeout mode.  It is either
	-1,,<addr of routine in DDT>   or an insn to $X.
	The insn can find the value to type out in 37 (but see .40ADDR).
	The open location's addr will be in 25 (but see .40ADDR).
	If the insn is a subroutine call it shouldn't skip;
	otherwise it should return with .BREAK 16,504000 .

..TPRIME
	holds the job's ' typeout mode.  Initialized from ..MPRIME.

..TDQUOT
	holds the job's " typeout mode.  Initialized from ..MDQUOT.

..TNMSGN
	holds the job's # typeout mode.  Initialized from ..MNMSGN.

..PATCH	0 if not patching;  else <patched-from>,,<patch-area>

..UFNAME
	4-word block holding the name of the last file loaded.
	1st wd holds device, then FN1, FN2, SNAME.
	All 4 wds are left-justified SIXBIT.

..UFILE	a 5-word block containing the default names for
	loading, dumping etc.

..UNDEFL
	an AOBJN to the undefined-symbol-reference table
	in DDT) for this job.  See "?".

..JOBSYM
	an AOBJN -> this job's symbol table.

..PRGM
	an AOBJN -> the tail end of the symbol table,
	starting at the header for the current block.



Special pseudo-locations in DDT:
 These symbols are like those in the preceding section except that
 the variables they point at are not per-job.

..DDT	location 0 in DDT.
	..DDT+<addr> is location <addr> in DDT.

$M	is the address of the block of 8 words
	holding the 8 search masks for $N and $W.
	Their initial values are:
	-1 ? ,-1 ? -1,, ? 0 17, ? 17,, ? -1 ? -1 ? -1.
	See the $M command.

..CLOBRF
	if this flag is nonzero, the user is protected from himself.
	<prgm>↑K typed when a job named <prgm> already exists
	queries "--Clobber Existing Job--".  A space will tell
	DDT to go ahead and load a new copy of <prgm> over the old.
	Anything else aborts the operation.
	This flag is initially nonzero, but is zeroed by "<name>$U".
	It is not zeroed by :LOGIN, however.
	The assumption is that anyone who doesn't know about $U
	probably needs protection from himself.
	If the DDT is already logged in when it starts (it is an
	inferior, or was reloaded by $U.), ..CLOBRF is also zeroed.

..GENJFL
	initially -1, if set to zero ..GENJFL causes :<prgm>
	to behave like :RETRY <prgm> instead of :NEW <prgm>.

..MORWARN
	if this flag is nonzero, every unsolicited offer (such as
	--More--) will say "(Space=yes, Rubout=no)" so the user
	will know how to respond.  ..MORWARN initially holds 1,
	but it is zeroed by $U and in inferior and reloaded DDT's.

..DELWARN
	this determines whether single-character file-handling
	commands should be verbose.  If 0, they are all brief.
	if 1, only ↑o (delete) is verbose.  If 2, most are verbose.
	When a command is verbose, as soon as it is typed it will
	print out a statement of what it will do (such as
	"(Delete File)"), and then will pretend the user typed
	an altmode - it will print out the default filenames.
	A verbose command does not need any extra type-in as
	confirmation;  it just types more out.
	The default setting of ..DELWARN is 1.

..UNPUR	iff this word holds nonzero, as it does initially,
	the automatic unpurification feature is enabled.
	Whenever DDT tries to deposit in the inferior and can't
	because the page is pure, DDT will unpurify the page
	and type out ":UNPURE <addr> " where <addr> is the location
	being deposited into.  Absolute pages will not be unpurified
	and will still cause "PUR? " errors.

..PCPNT	iff this word is nonzero, it enables the feature which,
	whenever DDT prints the next instruction to be excuted,
	automatically opens the AC and memory location referenced
	by that instruction (but returning due to a ↑z is an
	exception - the locations are never opened in that case).
	When this feature comes into play, the locations are
	opened as if by space.  DDT tries to avoid opening any
	which are not really used by the instruction.
	The user can supply information on which UUOS use
	their addressed locations and their specified ACs
	by defining symbols starting with "..U" (see ..U010).
	If the instruction doesn't refer to memory but is indexed
	or indirect, DDT will give the effective address.
	This flag is initially nonzero on displays only.

..RAID	if nonzero, DDT automatically displays the raid registers
	whenever a job returns.  If zero, raid registers are
	displayed only by $V commands.  Initialized to zero on
	printing consoles, but nonzero on displays.
..RAID+1
	holds the number of raid registers to allocate space
	for.  The default is 8.  Space for raid registers for
	a job is allocated the first time a raid register is set
	in that job.  The space is not freed except by a :RAIDFL.
	increasing the value in ..RAID+1 will not give a job more
	raid registers if they have already been allocated,
	unless a :RAIDFL is done to force them to be re-allocated.
..RAID+2
	if nonzero (as it is initially), causes raid registers to
	be displayed at the top of the screen on display consoles.
	Otherwise, they are just typed out in the normal stream.
	On printing terminals this lag has no effect.

..MSTYPE
	holds the new-job-default stepping flags.

..DOZTIM
	holds the number of seconds to wait between multi-steps
	and before auto-proceeding a breakpoint.
	(This time overlaps typeout of next insn, etc)
	Initially contains 1.

..SENDRP
	tells DDT when to print various random typeouts.
	-1 => if DDT doesn't have the TTY, it waits till it does.
	0 => if a random typeout becomes necessary and
	DDT has given the TTY away, it prints the message immediately,
	and prints it again when it gets the TTY back.
	Positive => like 0, but if the TTY is a display,
	and DDT doesn't have it, DDT repeats the messages at
	fixed intervals.  When DDT gets the TTY back,
	it prints them one last time.  The length of time waited
	is the contents of ..SENDRP times 1/60 sec.
	..SENDRP initially holds 60.*60. .

..SMLINS
	initially zero, if nonzero it tells DDT to truncate :SEND
	messages.  See "unsolicited typeouts" for details.

..TWAITF
	tells DDT how to initialize the .TTY variables of new jobs.
	If positive, ..TWAITF is copied into the .TTY variable
	(initializing the %TBINT and %TBNVR bits only).  If negative,
	that says that the default settings - %TBINT on and %TBNVR
	off - should be used.  Initially, ..TWAIT is negative.
	If a job is created with 0 in ..TWAIT, then even if you ↑P
	the job, thus setting %TBWAT, the job will still do
	nothing but hang dumbly if it tries to use the TTY and
	doesn't have it.  However, you or the program can alter
	.TTY in which case ..TWAIT has been overruled.
..TWAIT+1
	is related to ..TWAIT.
	normally it is 0.  If it is set to -1, the meanings of
	↑P and $↑P are interchanged.
	see .INFO.;ITS TTY for what %TBINT, %TBNVR, %TBWAT do
	and why you might want to use these variables to hack them.

..SYMOFS
	gives the largest allowed numeric offset in symbolic typeout
	mode.  Rather than print a value as <sym>+<n> with <n> larger
	than the maximum, it will print the value numerically.

..SCH	holds the current temporary typeout mode.

..MPERCE
	holds the % typeout mode for use when there is no current job.
	Also used to initialize the ..TPERCE variables of new jobs.
	Initially set to -1,,..TMS when DDT is loaded.

..MAMPER
	similar, for & mode.  Initially -1,,..TMSQ (SQUOZE mode)
	thus, $& will cause typeout in SQUOZE mode,
	unless you explicitly changed the contents of ..MAMPER
	before the current job (if any) was created, or changed the
	job's ..TAMPER variable after it was created.

..MDOLLA
	similar, for $ (dollar) typeout mode.  Initially -1,,..TMS .

..MPRIME
	similar, for ' mode.  Initially -1,,..TM6 (SIXBIT typeout)

..MDQUOT
	similar, for " mode.  Initially -1,,..TMA (ASCII typeout)

..MNMSGN
	similar, for # mode.  Initially -1,,..TMCH (single-char. ASCII)

..TMS	the address of the symbolic mode typeout rtn.
	Put -1,,..TMS in ..TDOLLA to reset it to symbolic mode.

..TMSQ, ..TM6, ..TMA, ..TMCH
	the SQUOZE, SIXBIT, ASCII and single character ASCII rtns.

..TMC, ..TMF, ..TMT, ..TMH
	the constant, floating, $T and halfword mode rtns.

..TTYFLG
	DDT types output on the TTY if this holds zero.
	AOS'd by ↑W from TTY or valret or file,
	SOS'd (unless 0) by ↑V, :V, :VK or :VP in valret or file,
	SETZM'd by ↑V, :V, :VP, :VK typed on TTY
	 errors, and abnormal returns from inferiors
	  (the same types of returns that would do a :INPUSH)

..LPTFLG
	DDT outputs to wallpaper file if any if this holds 0.
	AOS'd by ↑E, SOS'd by ↑B in files, SETZM'd by ↑E
	typed on the TTY and by :WALBEG.

..ESSYM
	if contents are zero, E&S display instructions
	will be defined on type-in.  Initially 0 except on DM machine.

..MONMOD
	if this is nonzero, DDT is in monit mode.
	DDT generates (and types out) colons, causing input to be
	treated automatically as :-commands.  To leave monit mode
	temporarily, just rub out one of the colons -
	DDT will not generate another until there is an error
	(such as another rubout, when there's nothing to rub).
	This is initialized to 0 when DDT starts up unless
	it is on the Dynamod machine and not logged in.

..MSNAME
	holds your "MSNAME", in SIXBIT.  The MSNAME is used
	as the default $L SNAME of new jobs, as the initial
	sname for the new jobs themselves, as the first directory
	to search for programs being run by ↑K or :-commands,
	etc.  See "DDT's UNAMEs".

..DIRFN1
	holds the FN1 to be given to the DIR: device by the
	$$↑F command.   Initially, it is SIXBIT/FIRST/.
	Another useful setting is SIXBIT/NAME1/.

..DIRFN1+1
	holds the FN2 given to DIR: by $$↑F.  If it is zero,
	as it initially is, the current default FN1 is used.
	Thus, putting $1'CDATE$ in ..DIRFN1, and $1'DOWN$
	in ..DIRFN1+1, will make $$↑F give a directory sorted
	by creation date.

..XUNAME
	holds your "XUNAME", in SIXBIT.  The XUNAME says who
	the user is, for the sake of looking a mail and messages,
	and for DDT init files (see "DDT's UNAMEs").
	In addition, the XUNAME will be put in the .XUNAME
	variables of inferiors to tell them who is running them.
	The XUNAME is set by logging in to the specified desired
	uname minus trailing digits.
	Jobs may read or set the XUNAME with a .BREAK 12,.

..DDT+<any .uset-variable>
	holds DDT's variable of that name
	(just opening the .USET variable would give the current job's
	value)


(More info on next page)
Typeout modes:

The contents of a memory location may be interpreted by a program
in many different ways.  DDT knows several of the most common ways,
in that it can print the value of a word by showing what it would
mean given a desired method interpretation.  For example,
"symbolic typeout mode" prints a word as a symbolic address
or as a PDP10 instruction containing one;  "ASCII typeout mode"
prints a word as five ASCII characters;  "Constant typeout mode"
prints a word as a number.
Some typeout modes have sub-options.  For example, those that print
numbers will use whatever output radix has been specified.

At any time, one typeout mode is "selected" or "current".
Most DDT commands that print the value of a numerical quantity
will use the current typeout mode (some commands, that know
the significance of what they are printing, always use the
appropriate mode regardless of what mode is selected).
DDT commands exist for selecting various typeout modes
either temporarily or permanently.  If a new mode is
selected permanently, it remains selected until explicitly
replaced.  If the current mode is changed temporarily,
the new selection remains in effect only until the next
↑M (Carriage Return) command.  At that time, the last
permanently selected mode will be made current again.

Each typeout mode that DDT has, has a command to select it.
The commands to select a mode temporarily all have
exactly one altmode.  If a second altmode is used,
the selection is made permanent.  For example, $F selects
typeout as floating-point numbers, temporarily.
$$F selects the same mode permanently.

When a typeout mode has sub-options (such as whether to
print component addresses numerically or symbolically, or
what bit-name prefix to use), those sub-options may also
be set either temporarily or permanently.  When the sub-option
is set by an argument in the command that selects the mode,
the sub-option is set temporarily if the mode is being
selected temporarily;  permanently, if the selection is permanent.

In addition to the temporarily and permanently selected modes
(also known as the "temporary mode" and the "permanent mode"),
DDT remembers the which mode was most recently explicitly
specified.  This variable is updated just as the temporary
mode is, except that it is NOT reset by carriage returns.
The most recent mode can be used to type one value with the
";" command, or selected temporarily or permanently with
"$;" or "$$;".

The user may define typeout modes of his own, by supplying
an instruction (generally a call to a subroutine) which
will print a value in his favorite manner.  Some mode-selecting
commands ($", $#, $$, $%, $&, and $') select not a fixed mode
but a user-choosable one.  The terms "# mode", "$ mode", etc.
mean "the mode that $# currently specifies", etc.  Some of
those modes are initially set to useful built-in typeout
modes such as ASCII mode, SQUOZE mode, etc.  Others ($$ and $%)
are initially useless.  Each job has one DDT variable for each
of those commands, which controls which mode the corresponding
command will select in that job.  The DDT variables are called,
respectively, ..TDQUOT, ..TNMSGN, ..TDOLLAR, ..TPERCE, ..TAMPER
and ..TPRIME.  Each variable can contain either -1,,<addr in DDT>
or an instruction to be executed in the job itself.  No addresses
in DDT should be used except those designed for such use.
They have names starting with ..TM:  ..TMSQ is the address of
the SQUOZE typeout mode, for example.  Those symbols are
described all together in the Specially Used Symbols section;
see ..TMSQ there.  If an instruction is used, it should be
a call to a subroutine that will expect the value to be
typed out in location 37 (but see .40ADDR).  In addition,
the addrress of the open location will be in 25 (but see .40ADDR).
The typeout routine should return with a .BREAK 16,504000 .

With the exception of $T mode, all of the built-in DDT typeout
arrange for their output to be in a form suitable for being
typed back in.  That is automatic for $C, $H, $F and $S modes.
For the ASCII, SQUOZE, and SIXBIT typeout modes, it requires
that the data typed out be preceded by an appropriate DDT
operator for reading the data back in, and that it be printed
in the syntax used by that operator.

Here follow descriptions of the fixed built-in typeout modes.

$C	selects Constant mode, in which words are typed out
	 as numbers, using the currently selected output radix.

$E	selects E&S mode, in which words are typed out as E&S
	 display processor instructions.

$F	selects Floating point mode, in which words are typed out
	 as floating point numbers.  The radix is always decimal.

$H	selects Halfword mode, in which words are typed out
	 as <lh>,,<rh>, with each halfword printed as an address.

$S	selects Symbolic mode, in which words are typed out
	 as cleverly as DDT can manage, either as a PDP10 instruction,
	 in halfword mode, or as a number.  In the first case,
	 the address, index and AC fields are printed as addresses.
	 In the other two cases, the ordinary $C and $H mode
	 actions are used.  The decision of which format to use
	 is complicated, but PDP10 instruction printout is used
	 whenever it makes sense.  With I/O instructions, the user
	 can control the decision;  see ..D010 in the section on
	 Specially used symbols.

$<n>T	selects typeout of words as decomposed into <n>-bit bytes.
$<pat>T	selects typeout of words as decomposed into bytes in
	 an arbitrary pattern specified by <pat>.  The byte
	 boundaries occur where two adjacent bits in <pat> differ.
	 Thus, the pattern 707070,,631463 divides the LH into
	 3-bit bytes and the RH into 2-bit bytes.

$T	selects typeout of words as decomposed into bytes
	 according to the last byte size or pattern specified.


Here follow the descriptions of the built-in typeout modes
 that are the initial settings of the variable commands $", etc.

$"	is initially set to select full-word ASCII typeout mode,
	 in which ASCII /<foo>/ types out as $0"<foo>$, and
	 ASCII /<foo>/+1 types out as $1"<foo>$.  Control
	 characters in <foo> are typed as uparrow followed
	 by the appropriate non-control character.  Uparrow
	 is preceded by a ↑Q.  Rubout is typed as uparrow-?.
	 Altmode is typed as uparrow-[.

$#	is initially set to select single-character ASCII
	 typeout mode, in which the ASCII code for <char>
	 is typed out as $1#<char>.  As in full-word ASCII
	 typeout mode, control characters are typed out with
	 uparrows and ↑ and ↑Q are preceded by ↑Q.
	 Altmode, however, is typed as an altmode.

$&	is initially set to select SQUOZE typeout mode, in
	 which SQUOZE <flags>,<symbol> types out as
	 $<flags>&<symbol>.  <flags> will always be a
	 multiple of 4, and less than 100 .

$'	is initially set to select SIXBIT typeout mode, in
	 which SIXBIT /<foo>/ is typed out as $0'<foo>$.


Here are the commands that control how addresses are printed:

$A	selects typeout of addresses as numbers (in the
	 selected radix).

$R	selects typeout of addresses symbolically, when possible.
	 An address which is not equal to any symbol will be
	 typed as <symbol>+<number>, provided that <number> is
	 less than the current contents of ..SYMOFS (initially
	 100).

$?	selects bit typeout mode, which is complicated, and
	 is described in the next section.


Here are the commands that select the output radix, in which
 numbers are printed:

$D	selects base 10.

$O	selects base 8.

$<n>R	selects base <n>.
Bit typeout mode:

Bit typeout mode makes it possible to interpret a word
in terms of particular sets of related symbols.  For
example, a word can be decomposed into a sum of several
symbols that are the names of flag-bits in a particular location.
The restriction is that all of the symbols' names must start
with the same prefix, since that prefix is how DDT is told
which symbols to use.

In addition to the prefix, bit typeout mode requires a byte
decomposition pattern, such as the $T typeout mode uses.
This tells DDT how to divide the quantity being typed
into bytes.  The symbols typed are not allowed to overlap
the byte boundaries, and each one must completely account
for the value of one of the bytes.  This restriction usually
prevents any trouble from unrelated symbols that happen
to begin with the current prefix.

The convention ITS uses for naming flag bits gives each flag
word two prefixes, one for LH bits and one for RH bits.
Therefore, bit typeout mode is actually applied to one
halfword at a time.  Each bit typeout prefix can specify that
it applies only to a single halfword.  In addition, it is
possible to have two different bit typeout prefixes selected
in DDT at a time, one for RH bits and one for LH bits.
The mechanism is this:  in DDT, there is a "main selected
bit typeout mode" variable, and an "alternate selected bit
typeout mode" variable.  Each one can contain a prefix and
a byte decomposition pattern.  When bit typeout mode itself
is enabled, the main bit typeout mode is used for whatever
halfwords it applies to;  when it does not apply, the
alternate bit typeout mode is used if it applies.

When a new bit typeout prefix is selected, it normally
becomes the main selected but typeout mode.  The previous
main selected mode becomaes the alternate.

The main and alternate bit-typeout prefixes are in
..BITS and ..BITS+1 as SQUOZE values.
The main and alternate byte-decomposition patterns are in
..BITP and ..BITP+1.

Assume from now on that the prefix is "%TX".  It in fact may
be any number of characters long, and is a prefix for
bit names.  It is most useful if unique in the first three
characters.

When %TX bit-typeout mode is set, the byte-decomposition mask
is determined.  This is the value of the symbol "%TX", if it is
defined;  otherwise, the value of "..B%TX", if that is defined;
otherwise 525252,,525252 octal.
(The byte-decomposition mask may also be set explicitly by specifying
it as an infix argument to $? or $$?.)
The byte-decomposition mask divides the word into fields in much the
same manner as the $T mask does.  If the byte-decomposition mask
is negative, then it divides the word into fields.
If it is positive, then its right half is divided into
fields, and bit 3.1 determines the half (0 = RH, 1 = LH)
which the mask applies to.

Bit-typeout mode is actually superimposed on other modes:

	$H typeout types the left half using left-half
	bits, and the right half using right-half bits.

	$S typeout, if it converts itself to $H, follows
	$H rules.
	Otherwise it types just the address field as bits,
	or perhaps not as bits.  For example, TLNE uses
	left-half bits, TRNE uses right-half bits,
	HRLI uses left-half, HRRI uses right half,
	HRRZ does not use bits, JRST does not use bits.
	These op-codes use left-half bits:
		MOVSI
		HRLI	HRLZI	HRLOI	HRLEI
		TL--
	These op-codes use right-half bits:
		MOVEI
		SETCMI	SETMI
		HRRI	HRRZI	HRROI	HRREI
		ANDI	ANDCAI	ANDCMI	ANDCBI
		IORI	ORCAI	ORCMI	ORCBI
		XORI	EQVI
		TR--
	Op-codes which do not use bits always use the most
	recent setting by $<$>A or $<$>R.
	$H;  can always be used to see bits explicitly
	as left-half,,right-half, if $S doesn't give
	exactly what is desired.  To see "the other kind"
	of bits, ($Q)$H;  can always be used.

	# mode uses $S mode after extracting the low seven
	bits, and so follows $S rules.

These modes use bit-typeout iff the bit-typeout flag is set.

The bit-typeout algorithm proceeds as follows:
for each field of the byte-decomposition mask, examined in order from
left to right, which contains nonzero in the value being printed,
use that field to mask the quantity to be
typed out.  Look up this value in the symbol table.
If a symbol is found with that value,
and its first characters are %TX, then type out that symbol
followed by a "+".  Otherwise, look up the value consisting
of a 1 right-justified in the field;  if a symbol beginning
with %TX is found, type out "n*%TXFOO+" where n is the value
in the field, typed as a number in the current output
radix, and %TXFOO is the symbol found.
Otherwise, look up the whole field;  if a symbol beginning with
%TX with that value is found, type out "n&%TXFOO+", where
n is the number being printed in bit mode, AND'ed with
the field being handled.
Otherwise do not type out anything for that field.
After all fields have been typed out, the sum of all
fields not typed out yet is typed out in the current address
printing mode (absolute or relative).
However, if this quantity is zero, it is not typed out, and
the last "+" from bit-typeout mode is suppressed.
Also, if left-half bits from a full-word byte-decomposition mask
are being used to print out a half-word, the names of the
bits are enclosed in parentheses.
thus:		TLNE TT,(%QXABC+%QXDEF+%QXGHI)

Example:
		201140000701    %TX$?#
	would type out
		MOVEI C,%TXMTA+%TXCTL $1#A
or something like that.

Example:	consider these definitions in a program:
	%QXSYM==400000		;funny bits
	%QXLET==200000
	%QXNUM==100000
				;some bits not defined
	%QXCNT==7000		;a field
	$QXERS==700		;another field
	%QXERS==100		;name for its low bit
	$QXQTY==77		;another field
	%QXQTY==1		;name for its low bit

Then these quantities would type out as follows:
	Quantity	Bit Typeout
	43		43*%QXQTY
	123456		%QXNUM+3000&%QXCNT+4*%QXERS+56*%QXQTY+20000
	500000		%QXSYM+%QXNUM
	665400		%QXSYM+%QXLET+5000&%QXCNT+4*%QXERS+60000


(More info on next page)
Unsolicited typeouts:

 Unsolicited typeouts are those that occur because of
 asynchronous conditions detected by DDT, rather than
 as the response to a user command.
 They can occur at any time - even if you are in a COM link;
 even if DDT has given the TTY to an inferior!
 In that case, on display TTYs, the messages
 will be repeated every minute until you return to DDT,
 and then once more immediately.  This is to prevent
 display hacking programs from wiping out the messages
 by clearing the screen, etc.
 On printing TTYs, the messages won't be retyped.
 Those actions are the default.  Deposit in ..SENDRP to change them.



1) Job <jname> Interrupting: <interrupts>
 means that an inferior that does not have the TTY has had
 a fatal interrupt (which may mean a .BREAK 16, or simply that
 the job attempted to use the TTY which it didn't have) and has
 interrupted DDT.  Since it can't really return to DDT without
 the TTY, DDT informs you of its desire to return so you can give
 it the chance if you wish (eg, just type $J at DDT).
 The job that interrupted is now in a "waiting" state, and will
 show up with a "W" if $$V is done.  $J without argument, or
 $P, ↑P or ↑X with that job selected, will make it "return to DDT".
 Then it will be "stopped" instead of "waiting".

2) Job <jname> wants the TTY
 means that the job tried to use the TTY and couldn't.
 the job might be waiting for input or for a chance to type out.
 In either case, $P will start it up again.  Just as in case 1),
 the job is "waiting", and $J, or ↑X, will make it
 return.  It will say it got a "DTTY" interrupt, which is true.
 At this point it will be "stopped", so $P, etc. will work.
 This case is actually a special case of 1), except that $P
 has been made more convenient and the message is different.

3) Job <jname> Finished
 means that the job did a .BREAK 16,160000,
 and is now gone unless it had been the current job, and ↑P'd,
 in which case $P will tell it to die and ↑X will stop it.

4) Message from <sender's-uname> <jname>
<text (possibly several lines)>
 This means that someone has done a :SEND to you.
The texts of all the messages sent to you are
saved in COM:<your-runame> SENDS, but only until you log out.
If the text of the message begins with rubout,
the "Message from <uname> <jname> which DDT normally supplies
will be suppressed.
If ..SMLINS is nonzero, then under certain conditions (a display
terminal not in COM mode) DDT will stop printing a :SEND after
that many lines (however many ..SMLINS says), and either say
--More-- or say how many lines are left.  The whole message
always goes in the sends file.  This feature needs changes
to become a real winner.

5) <machine name> ITS Going Down In <rel time>
means that ITS will stop running in <rel time> from now.
When that happens, everyone will be logged off automatically.

6) <machine name> ITS Revived
means that ITS won't go down after all (we hope).
This happens when a request for ITS to go down is cancelled.

7) ITS Being Debugged!
means that ITS is in danger of crashing at any moment.

8) Alarm, Type ":ALARM<cr>" To Clear
means that the time mentioned in the last :ALARM command
has arrived.  This message will repeat every minute, (or however
often ..SENDRP requires) regardless of whether an inferior has the TTY,
Until you give the command mentioned, which clears the alarm.


(More info on next page)
Unsolicited offers:

At times DDT will think that you might want some service (such as
printing of mail), or will wonder whether you really want to execute
a command which will have drastic effects that it doesn't usually have
(such as starting a new copy of a program when you already have one).
In those cases, DDT offers to gp ahead, and allows the user to say no
or abort.  DDT prints a message, which will usually start and end with
"--", and then reads a character.  Space tells DDT to perform the
optional service or go ahead with the command.  Rubout tells DDT not
to perform the service, or to abort the command.  Anything else acts
as if it were preceded by a rubout, on the theory that explicit orders
should override DDT's attempts to guess.  Anything but space causes
a message (usually "Flushed") to be printed indicating that the offered
service was not performed.

For the sake of the naive, if ..MORWARN is nonzero DDT will print
"(Space=yes, Rubout=no)" after every offer.

The offers that can be made now are:

--More--
	when a typeout reaches the bottom of the screen, DDT offers
	to print more.  If flushed, not only the printing but the
	execution of the command will be aborted.

--Msgs--
	when you log in or do :INTEST or :MSGS, and there are new
	system messages you have not seen, DDT offers to print one.
	This offer is unusual in that rubout acts like a space and
	tells DDT to go ahead;  all other characters still tell DDT
	not to go ahead, but they say "Postponed" instead of "Flushed"
	since DDT will offer again later.

--Mail--
	when you log in or do :INTEST, if you have mail DDT offers
	to print it.  If flushed, it says "Postponed" instead of
	"Flushed".  Rubout flushes, as usual, unlike --Msgs--.

--Attach Your Detached Job--
	when you log in, if you have a detached tree that appears
	alive enough to be attached to successfully, DDT offers
	to do so.  If you flush this, it goes about logging in
	in the normal way, and runs your init file, etc.
	The detached job is left detached, and DDT says so.

--Reset All--
	when you :CHUNAME, normally many user-settable options are
	not reset, but DDT offers to try its best to reset them.

--Init--
	DDT is offering to run your init file, because either
	DDT was already logged in when started, or your XUNAME
	doesn't equal your RUNAME.  In either case, a space will
	tell DDT to run your init file, while anything else will
	tell it to do nothing.

These offers are essentially requests for confirmation of a command
that would make DDT do something drastic.

--Kill Protected Job--
	a command has been given which would kill a protected job
	(one whose ..SAFE variable is nonzero).  DDT will go ahead
	if a space is typed;  otherwise, it will err out.

--Reload Protected Job--
	a command has been given which would destroy the contents
	of a protected job (eg, $L).

The following confirmation-type offers are made only if ..CLOBRF
is nonzero.  If it is zero, DDT goes ahead without asking.

--Kill Running Inferiors--
	you attempted to log out or :CHUNAM while some of your
	inferiors were running.  Space causes the command to go
	ahead, while flushing aborts it.

--Clobber Existing Job--
	you tried to run a program with ↑K, and you already had
	a job with the same name as that program.  Running the
	program would require clobbering that job's contents.

--Create Additional Job--
	you tried to run a program with :, when  you already
	had a job with that name.  Running the program would
	involve creating a new job.
Returning to DDT:

  When a job gets a class 1 or disabled class 2 interrupt,
  DDT is interrupted.  If the interrupt was due to a breakpoint
  or MAR, DDT will use the conditional instruction, if any,
  and the breakpoint proceed count, to decide whether the job
  should really be stopped.  Any other sort of interrupt always
  causes DDT to decide the job must be stopped.
  If the job had the TTY it "returns to DDT"
  immediately.  Otherwise it is waiting ($$V will type "W")
  and will return to DDT when $J with no argument is given,
  or an $J specifically to that job, or an $P in the job.

Returning to DDT involves the following actions:

  Breakpoints are removed from the job.
  If the job stopped with a .BREAK 16, requesting
  death, it will die, saying ":KILL ".
  Otherwise something may be printed out, depending
  on what stopped the job.  The possibilities are:

	1) ↑Z (and nothing else)
	2) a breakpoint
	3) a .VALUE with nonzero address
	4) the job tried to use the TTY and didn't have it.
	5) any other interrupts.

  DDT's reactions are (case by case):

	1) type <pc>) <next insn>.
	   In this case only, the AC and memory location of the
	   instruction are not opened, regardless of ..PCPNT, since
	   the user is probably not debugging.
	2) complicated;  see below under "breakpoints".
	3) if the job is returning immediately (because it had
	   the TTY when it executed the .VALUE), or because of
	   an $P, execute the
	   ASCIZ string pointed to by the .VALUE as DDT commands
	   (this is what .VALUE is for.  See "instructions that
	   return to or call DDT").  If the job is returning because
	   of an $J with argument, treat this like case 5).
	4) this is impossible if the job is returning immediately.
	   If it is returning because of an $P,
	   give the job the TTY and proceed it.  If the job is
	   returning after being $J'd to, treat this
	   like case 5).
	5) print the next insn, and the names of the interrupts:
	   <fatal ints> <pc> >> <next insn>
	   then (if ..PCPNT is nonzero) open (as if by "/") the
	   AC and memory location referenced by the instruction just typed.
	   If the insn doesn't use the AC, or the memory location,
	   it won't be mentioned.  If the insn doesn't use the memory
	   location, but it is indirect or indexed, the effective
	   address will be typed:  " E.A. ← <value>"
	   If the instruction is a UUO, DDT looks for a symbol
	   whose name is "..U" followed by the op-code, to tell
	   whether the AC and memory location are used;  see
	   ..U010 for details.

	   The interrupt names are separated by semicolons.  A table
	   listing all the interrupt names appears below.

  In any case, if there are pending non-fatal interrupts (which
  will be handled by the job, rather than by DDT), DDT prints
  their names in parentheses before the pc.

Breakpoints:

  A job that hits a breakpoint won't always return to DDT.
  Upon encountering a bpt, the bpt's proceed count
  is decremented, and tested for zero.  If it has reached zero,
  the program returns to DDT typing $<n>B <pc> >> <insn>
  (and opening the AC and memory loctaion, if appropriate).
  (A bpt's proceed count is stored in $<n>B+2 and is set by
  <count>$p after stopping at that bpt.)
  Otherwise, if the conditional break instruction (in $<n>B+1)
  is non-zero, it is executed, and if it skips, then the
  job returns to DDT typing $<n>B <pc> > <insn>
  (and opening the AC and memory loctaion, if appropriate).
  Otherwise, the program is continued without typeout.

  When a breakpoint causes a return to DDT,
  if the bpt has been set to type out a specific location,
  (LH of $<n>B has address) that location will be opened.
  Then, if the breakpoint has been set to auto-proceed,
  an $P will be done, unless a character has been typed in.
  (Any char. will do;  it will be read normally)
  ..DOZTIM holds the # seconds DDT will insist must elapse
  from the time the bpt is hit till DDT proceeds the job.

  A breakpoint is represented by a .BREAK instruction,
  whose AC field gives the number of the breakpoint.
  The .BREAK is put into the job when it is started or
  continued, without changing the address, index or indirect
  fields of the broken instruction.  When the job returns
  to DDT, for any reason, the .BREAK's are replaced by the
  remembered original op-codes and AC fields.  The index,
  indirect and address fields, again, are untouched.
  If DDT finds itself unable to insert a .BREAK, it clears
  the corresponding breakpoint, typing 0$<n>B to log it;
  if a breakpoint is no longer there when DDT tries to
  remove it ( it has been replaced by other than a .BREAK)
  DDT says "Breakpoint <n> Clobbered".

1st word (.PIRQC) interrupt name table:

  (The 1st char on each line is " " for a class 3 int.,
   "?" for a class 2 int, and "-" for a class 1 int)
  ("Should never be typed" means that DDT handles that interrupt
   specially.  Eg, for the .BREAK int, DDT handles the .BREAK.
   As a result, you will never see ".BREAK;" mentioned).
  (The master list that this table reflects is in
   SYSENG;ITS BITS).



Code		Meaning				Bit in ..UPI0

 REALTM	  realtime interrupt (rqd by .REALT)		200000,,
 RUNTIM	  run time interrupt (see .RTMR)		100000,,
 <4/6>	  something set int. bit. <4.6>			40000,,
 <4/5>, <4/4>, <4/3> analogous.
?DTTY	  the job tried to use the TTY and didn't	2000,,
	   have it, when %TBINT was 1 (which is
	   the normal case)
-PARERR   a parity error in the job's core		1000,,
 ARFOV	  floating overflow				400,,
?PURPG	  wrote in pure page				200,,
?PURINS	  insn fetch from impure page			100,,
	 (this causes an int. only if a certain bit in the PC is set)
-SYSUUO	  any trapping insn in user trapping mode	40,,
 ARMTP3	  (not set by system nowadays)			20,,
 ARMTP2	  (not set by system nowadays)			10,,
 ARMTP1	  (not set by system nowadays)			4,,
 SYSDBG	  system being debugged				2,,
-RESTR 	  (not set by system nowadays)			1,,
 CLI	  core link interrupt				400000
 PDLOV	  push down overflow				200000
 LTPEN	  light pen hit on 340				100000
-MAR	  the MAR (set by $I) was tripped		40000
	(This is special in that the instruction that tripped
	 the MAR is printed after "MAR. " and all the remaining
	 messages come on the next line,
	 along with the next insn to do)
?MPV	  memory protection violation			20000
 SCLOCK	  slow (60cps) clock tick			10000
-1PROC	  1-proceed return (should never be typed)	4000
-.BREAK	  .BREAK executed (should never be typed)	2000
?ILUAD	  (i don't think this happens since pageing)	1000
?IOC	  input-output channel error			400
	(this is special in that it is mentioned on a line
	 by itself, along with the system error message
	 describing the type of error)
-.VALUE	  .VALUE executed (should never be typed)	200
 SYSDED	  system going down				100
?ILOPR	  illegal instruction				40
?DPY	  (what is this int)				20
 AROV	  arithmetic over flow				10
-BADPI	  bad location 42				4
	(job got int. but 42 wasn't set up, eg was 0)
-↑Z	  ↑z typed on TTY (should never be typed)	2
 TYPEIN	  any interrupt character typed on console	1
	(this is obsolete - use 2nd-word ints instead)

.VALUE 0. job did a .VALUE 0.				400000,,
	(note that that bit is not set in .PIRQC by the system
	but rather by DDT when it sees that the address is 0)

2nd word (.IFPIR) interrupt name table:

  (All these interupts are class 3.  They can still be fatal
   if the job requests it, using the vectoring interrupt scheme)

Code		Meaning				Bit in ..UPI1

 <4.9>	  shouldn't be seen				400000,,
 <4.8>	  something set bit 4.8 of .IFPIR		200000,,
	(its won't do this itself, but a .SUSET or
	 .USET can do it)
 <4.7>, <4.6>, ... <4.1>, <3.9> are similar.
 INF7	  bit 3.8 - an interrupt from an inferior job	200,,
 INF6, INF5, ... INF0 interrupts from other inferiors.
	(.UTRAN can be used to find what inferior
	 corresponds to a given interrupt bit.
	 Better yet is to read the .INTBIT uset-variable
	 of every inferior when it is created)
 <2.9>	  something set bit 2.9 of .IFPIR		400000
 <2.8>	  something set bit 2.8 of .IFPIR		200000
 IOCH17	  interrupt on I/O channel 17			100000
	(possible reasons depend on the device open
	 examples: TTY input - a character was typed
		   TTY output - bottom of screen was reached)
 IOCH16	  interrupt on I/O channel 16			40000
 IOCH15, ... IOCH0 similar				20000, ...


(More on next page)
Instructions that call DDT:

    An inferor can return a string of commands
to be executed by DDT with the .VALUE instruction.
The effective address of the .VALUE should point to
the beginning of an ASCIZ string containing the commands.
That address should not be 0.  If it is, different actions are taken.
TTY input will not be reset if the commands can be processed.
If, however, the ..PERM pseudo-location's contents are
nonnegative, the commands will not be executed and the job will
be stopped, and its PC backed up to before the .VALUE .
That will also happen if the job does not have the TTY
when the .VALUE is executed.

    A program can return to DDT, requesting various actions,
using .BREAK 16,'s.  When a .BREAK 16, in an inferior interrupts DDT,
its address part is interpreted as follows:

   bit  meaning if on
   2.9  $X return (don't use unless you know what you are doing)
   2.8  type extra carriage return in DDT
   2.7  do not reset teletype input (effective only if job has TTY)
   2.6  :KILL inferior
	immediately if it has the TTY,
	when it gets the TTY if it is the current job,
	or when it is $J'd to if not current.
	types ":KILL " when killed.
   2.5  kill inferior - like 2.6 but if the
	job is not current it will go away immediately
	and without informing the user in any way.
	2.5 and 2.6 both set cause the job to go away
	immediately if it isn't the current job, but the user is
	informed with a "Job <jname> Finished" message.
   2.4	conditional breakpoint return.  Used by DDT.
	2.8 on => condition true, off => false.
	Very dangerous to put in a program.
   2.3	Don't type even one cr;  don't close the open location;
	if killing self don't type ":KILL ".
   1.1-2.2  Illegal

     If ..PERMIT is nonnegative, .BREAK 16,'s that kill the
job or type nothing out are illegal, and DDT treats them like
.BREAK 0,'s.

     DDT uses .BREAK 16,'s and modifies
inferior location 34 to 36 in the current implementation
of the $X command.  Location 26 to 33 in the
inferior are used in conditional breakpoints.
Of course, none of the .BREAK 16, features
or .BREAK 12, features below work if
the program using them is not an immediate inferior
of a DDT (HACTRN).

     Inferiors may read and write various information
from and into DDT by executing .BREAK 12,'s
with the right arguments.  In a manner
similar to .SUSET, the ".BREAK 12," should
point at a word that has an information
type and direction specified in its
left half and points to the area to be read
or written in its right half except that
it may also point to an AOBJN pointer to a
block of such words.

 info type numbers
   0     illegal
   1     starting address
   2     loaded file name (4 words, dev, sname, fn1, fn2) (read only).
   3     aobjn pointer to inferior's symbol table in DDT (read only).
   4     symbol (see below)
   5     command string
   6	 :PRINT file-name defaults.
   7	 symbol table
   10	 number to symbol conversion (read only)
   11	 the XUNAME (semi-obsolete;  normally, use .SUSET to read the XUNAME).
   12	 the job's XJNAME (obsolete;  use .SUSET of .RXJNAM)
   13 up illegal

The following symbols are predefined in DDT
for reading and writing .BREAK 12's:

..RSTART,..SSTART  =  1,400001
..RLFILE,..SLFILE  =  2,400002
..RSTP		   =  3
..RSYM,..SSYM	   =  4,400004
..RJCL,..SJCL	   =  5,400005
..RPFILE,..SPFILE  =  6,400006
..RSTB,..SSTB	   =  7,400007
..RCONV		   =  10
..RXUNAM,..SXUNAM  =  11,400011
..RXJNAM,..SXJNAM  =  12,400012

The 4.9 bit on indicates write into DDT (..PERMIT must be <0)
the 4.9 bit off indicates read from DDT
except that if 4.9 and 4.8 are on, the
word is assumed to be an AOBJN pointer.
Info type 2 stores 4 words starting where the right half points.
    Info type 3 stores a quantity whose left half
is the size of the inferior's symbol table in DDT.
(note, this symbol table can move in DDT so it is not a good idea
to use the address info in the right half of the word stored.)
    Info type 4 assumes, on read, that the right half
points to a word with a SQUOZE symbol in it.
If the symbol is defined, its value is stored in the location
following the symbol.
If the symbol is ".", the value of "." is returned.
If the symbol is undefined, zero is stored where
the symbol was and the following location is unaffected.
A type 4 write defines the symbol pointed to by the right half
to have the value specified in the location following it.
     Type 5 allows an inferior to read from DDT
a command string associated with that inferior.
The job's .OPTION variable's bit 4.6 (OPTCMD bit) will be set
by DDT if a command is available.  If you don't try to get
a command when that bit is off, you'll have no trouble
being run by programs other than DDT.
The command string is initially empty when DDT
creates or attaches the inferior (i.e., types !)
or when it is ↑K'd.
It can be explicitly set by the :JCL
command followed by the string terminated by a carriage return
For programs loaded by ":", the associated string
is nullified if the program name is terminated
by a carriage return.  If terminated by
a space, a string is then accepted by DDT
as for :JCL.  The string is transfered
to the inferior as packed ASCII.  The first
word is always transfered.  Successive words
are transfered until either the previous word
transfered was zero or the word about to
be transfered into is nonzero.  (Note that the
terminating char is ↑M, ↑C or ↑←, and that command buffer
input is not necessarily upper-case)

     Type 5 write zeros the command string.
     Type 6 reads or writes a block of 4 words
as follows: device, SNAME, FN1, FN2  (all left-justified SIXBIT)
(that is still subject to change, so don't be surprised)
     Type 7 is like $$↑Y,
with the argument in the call used as the argument to the $$↑Y
(ie as the address of the AOBJN pointer to the table to be replaced)
writing info type 7 is like doing a ↑Y, with the arg to the call
pointing to the AOBJN pointer to feed to the ↑Y.
     Type 10 provides the essential part of symbolic typeout.
The argument is a number.  It is replaced by the SQUOZE code
for the symbol whose value is closest to but not larger than
the number, or 0 if there is no such symbol.
The word after the one containing the argument receives
the difference between the argument and the value of the
symbol, or the argument unchanged if there was no symbol.

     Type 11 allows the job to read or set the ..XUNAME
variable, which says what the user's name ought to be
for such purposes as finding mail.  However, it is more winning
to read your own .XUNAME variable with a .SUSET now that it
exists - that way, $↑S will work.  In reading, the XUNAME
is simply stored in the word pointed to;  for writing, the
value in that word is used.

     Type 12 allows the job to read or write its XJNAME,
to find out what program it is "intended to be" -
programs that have in the past decoded
their jnames will have an easier time and be more likely
to do what the user intends if they decode their xjnames instead.
Since the .XJNAME uset variable now contains this information,
programs should use .SUSET to refer to it.  The .BREAK
for doing so is obsolete.

     An illegal .BREAK 12, (this does not include undefined symbols)
causes DDT to give a %PIILO interrupt to the inferior.
For a block mode .BREAK 12, the AOBJN pointer
is counted out and stored back.


(More on next page)
Symbol Table Format:

Symbol Tables Inside DDT:

  The symbol table, in DDT, is composed of 0 or more groups of symbols.
  Each group has one header entry and 0 or more symbol entries,
  and corresponds to a single relocatable program or a single
  .BEGIN block (except for one, the "GLOBAL block", which is
  the "superior" in the hierarchy of everything else).

	Header Entry

     WD 1	Squoze name, with flags clear.
     WD 2	-<Length of block of symbols>,,<level>
	 	 (The level is 0 for the GLOBAL block, 1 for program name,
		  2 or more for a block name.  The length includes 2 for
		  the header itself)

	Symbol Entry

     WD 1	Squoze name & flags:
      4.9	(%SYHKL)  Half killed    (these symbols are not! predefined)
      4.8	(%SYKIL)  Fully killed
      4.7	(%SYLCL)  Local  (either this or 4.6 must be set)
      4.6	(%SYGBL)  Global (all global syms are in the GLOBAL block)
      4.5 and down	  The squoze itself.
     WD 2	Value.

	Order of Groups of Symbols

  The last group is always the GLOBAL block.
  Every program name precedes everything for that program.
  Every block follows its subblocks.
  A relocatable block-structured program should
  have an outermost block whose name is the same as the program name,
  and there should be no symbols after the program name itself.
  (syms defined outside .BEGIN-.END's should go in the group
  associated with the outermost block)
  :LISTP prints the names of the groups' headers in the reverse
  of the order they have in the symbol table.

The Undefined Symbol Table in DDT:

 Inside DDT, the "undefined symbol table" records all
 unsatisfied forward references to undefined symbols
 that were "deposited" in a job's core image.  It contains
 one 2-word entry per symbol.  The first word of each
 entry contains the symbol name, in squoze.  The
 second word's RH contains the address deposited in.
 The sign bit of the second word is set iff the
 symbol was deposited in the left half.

Symbol Table Formats in Files:

 The "symbol table" of a binary file contains the
 DDT symbol table and the DDT undefined symbol table,
 each divided at arbitrary points into "sections"
 which should be concatenated again when the file
 is read.  Its location in the file is immediately
 after the "start instruction" which terminates
 the data dumped from core (see AI:ITSDOC;BINFMT >).

 Each section of DDT symbol table has a word containing
 -<# of data words>,,0  at the beginning, followed by
 as many data words as specified, and a checksum.
 The checksum of a symbol table section is computed
 just like that of an SBLK (see ITSDOC;BINFMT >).

 Each section of DDT undefined symbol table starts
 with a word containing -<# of data words>,,1 (not 0!)
 after which come data words and a checksum.

 The two types of sections may be interspersed
 arbitrarily in the file.  After the last section of
 either type should come a positive word, which should
 be a second copy of the file's start instruction.

 In any file dumped by a recent DDT or assembled
 by a recent MIDAS, the DDT symbol table data (the
 concatenation of all the DDT symbol table sections)
 will have exactly the same format as the DDT symbol
 table proper, described above.  Some old files
 may have that data in a different format.  It is not
 necessary for any new programs to understand such
 formats, and certainly all new programs should write
 the correct format.  If such an old file is encountered
 and causes any problem, loading it with DDT and dumping
 the result should produce a usable file.  Some old
 STINK-loaded files may fail to load with $L.  :OLOAD
 should be used for them.